我有一个项目,其中我的业务层是使用 DI 构建的,但我正在尝试采取额外的步骤并使用 Windsor 来管理对象构建。
假设我有一个预先存在的数据层(我不想修改),可以通过以下接口(interface)访问:
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 似乎希望我说 container.AddComponent("dataService", typeof(IDataService), typeOf(SomeConcreteDataService)),但在这种情况下,ConcreteDataService 是该程序集的内部,因此在我的中无法访问。
如果我的程序集不知道 SomeConcreteDataService,我将如何连接数据服务?
This question与我自己的非常相似,除了在我的例子中, AddComponent("calculator", typeof(ICalcService), typeof(CalculatorService), "Create");调用不起作用——CalculatorService 将在另一个程序集内部,对连接容器的程序集不可用。
最佳答案
使用温莎 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);
}
}
参见 fluent API wiki page获取更多信息。
关于c# - 当我的程序集无法访问基础类型时,CasLe Windsor : How do I register a factory method,?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/858668/