c# - 当我的程序集无法访问基础类型时,CasLe Windsor : How do I register a factory method,?

标签 c# castle-windsor

我有一个项目,其中我的业务层是使用 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/

相关文章:

c# - 将扫描仪与 c# 应用程序集成

c# - 向 C# 类动态添加属性

c# - 如何在服务中获取 Controller 的 ModelState 以进行验证

dependency-injection - 比较温莎城堡、Unity 和 StructureMap

.net - 如何使用温莎城堡解决不同的实现

c# - 如何在 Microsoft.ApplicationInsights.AspNetCore“版本 ="2.20.0"及更高版本中禁用 Application Insights 日志记录?

c# - WithOptionalDependent 与 WithOptionalPrinciple - 最终答案?

c# - 检查两个json是否等价

c# - 温莎城堡高级工厂注册

c# - 带有 CaSTLe windsor 的 WCF Web 服务客户端