如何将参数传递给ITypedFactory方法,而不是创建的直接类

时间:2013-09-13 21:12:08

标签: c# dependency-injection castle-windsor

我有以下类层次结构:

public class FirstProvider : IFirstProvider
{        
    public FirstProvider (string data, ISecondProvider provider)
    {
        ...
    }
}

public class SecondProvider : ISecondProvider
{
    public SecondProvider (string data)
    {
        ...
    }
}

public interface IProviderFactory
{
    T Create<T>(string data) where T : IProvider;
}

IFirstProvider和ISecondProvider都实现IProvider并在容器上正确注册。我想要做的是从我的IProviderFactory获取FirstProvider的实例,如下所示:

public void DoSomething()
{
    var provider = _providerFactory.Create<IFirstProvider>("my data");
}

此时我收到以下异常:

“缺少依赖性。

组件SecondProvider对字符串有依赖性,无法解析。

确保依赖项在容器中作为服务正确注册,或者作为内联参数提供。“

看起来Windsor没有通过它必须解析的依赖链来传递ITypedFactory的参数来创建类的实例。还有其他方法可以支持这种设计,还是应该重新考虑我的设计?

1 个答案:

答案 0 :(得分:0)

似乎未正确注册组件以满足您的需求。 你能提供一块注册码吗?

我认为您应该尝试"a delegate as component factory"来解决您的问题。 有几个重载可能对你有帮助。

这样的事情:

container.Register(Component.For<ISecondProvider>().
    .UsingFactoryMethod(container =>
    {
        /* your code */
    }));
container.Register(Component.For<IFirstProvider>().
    .UsingFactoryMethod(container =>
    {
        var prvoider = container.Resolve<ISecondProvider>();
        /* your code */
    }));

也可以to pass arguments when you resolve a type。 有一个已回答的问题“Castle Windsor passing constructor parameters”。