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

Ninject factory interface resolve missing constructor args from kernel

尝试使用 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?

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

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

要么将您的工厂方法更改为 Get 以外的方法,要么添加此方法以为 B:

创建一个空的命名绑定
kernel.Bind<B>().ToSelf().Named("");