[英]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.