C# Castle Windsor:当基础类型为';我的大会无法访问?

C# Castle Windsor:当基础类型为';我的大会无法访问?,c#,castle-windsor,C#,Castle Windsor,我有一个项目,其中我的业务层是使用DI构建的,但我正在尝试另外一个步骤,使用Windsor来管理对象构建 假设我有一个预先存在的数据层(我不想修改),可以通过以下接口访问: interface IDataFactory { IDataService Service { get; } } 我的业务层中的一系列类依赖于通过IDataFactory公开的服务: IFactory factory = DataFactory.NewFactory(); IBusinessService servi

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

假设我有一个预先存在的数据层(我不想修改),可以通过以下接口访问:

interface IDataFactory {
   IDataService Service { get; }
}
我的业务层中的一系列类依赖于通过IDataFactory公开的服务:

IFactory factory = DataFactory.NewFactory();
IBusinessService service = new ConcreteBusinessService(factory.Service);
我知道,为了向Castle Windsor容器注册IBusinessService,我会使用类似以下代码:

IWindsorContainer container = new WindsorContainer();
container.AddComponent("businessService", typeof(IBusinessService), typeof(ConcreteBusinessService));
但就我的一生而言,我不知道如何使用现有的factory对象从数据层注册服务。本质上,我想说:

container.AddComponent("dataService", typeof(IDataService), factory.service);
Windsor似乎想让我说container.AddComponent(“数据服务”,typeof(IDataService),typeof(SomeConcreteDataService)),但在本例中,ConcreteDataService是该程序集的内部,因此在我的程序集中无法访问

如果我的程序集不知道SomeConcreteDataService,我将如何连接数据服务



与我自己的非常相似,除了在我的例子中,AddComponent(“calculator”、typeof(ICalcService)、typeof(CalculatorService)、“Create”);调用将不起作用--CalculatorService将位于另一个程序集的内部,不可用于连接容器的程序集。

明白了。答案是,您不需要担心实现类型:

    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"];
当我看到它成功执行时,我有一个“哇”的瞬间,因为我没有使用Windsor 2.0将特定的实现类型传递给Kernel.AddComponent()

[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);
    }
}
[TestFixture]
公共级WindsorTests{
公共接口IDataService{}
公共类数据服务:IDataService{}
公共接口IDataFactory{
IDataService服务{get;}
}
公共类数据工厂:IDataFactory{
公共服务{
获取{返回新数据服务();}
}
}
[测试]
public void FactoryTest(){
var container=新的WindsorContainer();
container.AddFacility();
container.AddComponent();
container.Register(Component.For().UsingFactory((IDataFactory f)=>f.Service));
var service=container.Resolve();
IsInstanceOfType(typeof(DataService),service);
}
}
有关更多信息,请参阅