繁体   English   中英

Castle Windsor:当我的装配无法访问基础类型时,如何注册工厂方法?

[英]Castle Windsor: How do I register a factory method, when the underlying type isn't accessible to my assembly?

我有一个项目,其中我的业务层是使用DI构建的,但我正在尝试额外的步骤并使用Windsor来管理对象构造。

我们只是说我有一个预先存在的数据层(我不想修改),可以通过以下界面访问:

interface IDataFactory {
   IDataService Service { get; }
}

我的业务层中的一系列类依赖于通过IDataFactory公开的服务:

IFactory factory = DataFactory.NewFactory();
IBusinessService service = new ConcreteBusinessService(factory.Service);

我知道为了将IBusinessService注册到Castle Windsor容器,我会使用类似于此的代码:

IWindsorContainer container = new WindsorContainer();
container.AddComponent("businessService", typeof(IBusinessService), typeof(ConcreteBusinessService));

但对于我的生活,我无法弄清楚如何使用我现有的工厂对象从我的数据层注册服务。 从本质上讲,我想说:

container.AddComponent("dataService", typeof(IDataService), factory.service);

Windsor似乎要我说容器.AddComponent(“dataService”,typeof(IDataService),typeOf(SomeConcreteDataService) ),但在这个实例中,ConcreteDataService是该程序集的内部,因此在我的程序中无法访问。

鉴于我的程序集不知道SomeConcreteDataService,我将如何进行数据服务的连接?


这个问题与我自己的问题非常类似,除了我的情况,AddComponent(“计算器”,typeof(ICalcService),typeof(CalculatorService),“Create”); 调用不起作用 - CalculatorService将在另一个程序集内部,不可用于组件连接容器。

使用Windsor 2.0:

[TestFixture]
public class WindsorTests {
    public interface IDataService {}

    public class DataService: IDataService {}

    public interface IDataFactory {
        IDataService Service { get; }
    }

    public class DataFactory: IDataFactory {
        public IDataService Service {
            get { return new DataService(); }
        }
    }

    [Test]
    public void FactoryTest() {
        var container = new WindsorContainer();
        container.AddFacility<FactorySupportFacility>();
        container.AddComponent<IDataFactory, DataFactory>();
        container.Register(Component.For<IDataService>().UsingFactory((IDataFactory f) => f.Service));
        var service = container.Resolve<IDataService>();
        Assert.IsInstanceOfType(typeof(DataService), service);
    }
}

有关详细信息,请参阅流畅的API Wiki页面

得到它了。 答案是,您不必担心实现类型:

    IWindsorContainer container = new WindsorContainer();
    container.AddFacility("factories", new FactorySupportFacility());
    container.AddComponent("standard.interceptor", typeof(StandardInterceptor));
    container.AddComponent("factory", typeof(DataFactory));

    MutableConfiguration config = new MutableConfiguration("dataService");
    config.Attributes["factoryId"] = "factory";
    config.Attributes["factoryCreate"] = "get_Service";
    container.Kernel.ConfigurationStore.AddComponentConfiguration("dataService", config);
    container.Kernel.AddComponent("dataService", typeof(IDataService));

    IDataService dataService = (IDataService) container["dataService"];

当我看到它成功执行时,我有一个“哇”的时刻,因为我没有将特定的实现类型传递给Kernel.AddComponent()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM