Ninject工厂接口解析内核缺少的构造函数args

时间:2017-07-06 06:58:03

标签: c# dependency-injection ninject

尝试使用Ninject的工厂扩展程序执行此操作。

void Main()
{
    IKernel kernel = new StandardKernel();
    kernel.Bind<C>().ToMethod(ctx => new C());
    kernel.Bind<IBFactory>().ToFactory();
    var a = kernel.Get<A>();
    a.Do();
}
public class A
{
    IBFactory _fact;

    public A(IBFactory factory)
    {
        _fact = factory;
    }

    public void Do()
    {
        _fact.Get("blah").Dump();
    }
}

public class B
{
    public B(C c, string s)
    {
    }
}

public interface IBFactory
{
    B Get(string s);
}

public class C
{
}

工厂界面失败,因为它没有C投入B()构造函数。但是它知道如何从内核生成C,但查找它超出了默认工厂方法实现的范围。

我可以创建一个自定义IInstanceProvider并将其传递给工厂方法,例如ToFactory(() => new myCustomIIProvider())从内核解析C,但它似乎很多工作。

是否有更简单的方法让Ninject自行解决丢失的ctor arg?

1 个答案:

答案 0 :(得分:0)

实际上,问题不在于C服务的绑定,而在于B的绑定。

默认的Factory实例提供程序将为以Get开头的方法创建命名绑定(请参阅here)。

将工厂方法更改为Get以外的其他方法,或者添加此方法以为B创建空命名绑定:

kernel.Bind<B>().ToSelf().Named("");