c# – 温莎城堡:当我的装配无法访问基础类型时,如何注册工厂方法?

我有一个项目,其中我的业务层是使用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,我将如何进行数据服务的连接?

This question非常类似于我自己,除了在我的情况下,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);
    }
}

有关更多信息,请参见fluent API wiki page.

转载注明原文:c# – 温莎城堡:当我的装配无法访问基础类型时,如何注册工厂方法? - 代码日志