我有一个带有 Ninject v2.2.1.4 的 ASP.NET MVC 3 应用程序。一切都很好,然后突然我们开始看到 Ninject 尝试使用带有参数的构造函数而不是无参数构造函数来创建 DbContext。以下是绑定:
kernel.Bind<MyContext>().ToSelf().InRequestScope();
kernel.Bind<IUnitOfWork>().ToMethod(ctx => ctx.Kernel.Get<MyContext>());
kernel.Bind<DbContext>().ToMethod(ctx => ctx.Kernel.Get<MyContext>());
MyContext 是一个 DbContext 对象,它也实现了 IUnitOfWork 接口。我以这种方式进行了设置,因此将相同的上下文注入到单个请求中使用的多个存储库中。MyContext 构造函数如下所示:
public MyContext() { }
public MyContext(string connectionString) { }
public MyContext (long accountID) { }
public MyContext (Connection connection) { }
不同的应用程序有不同的构造函数,因为它们都使用相同的 MyContext 类。查看绑定时,您会认为当请求 MyContext 类时会调用无参数构造函数,但无论出于何种原因,它都不是。即使没有指定 accountID,也会调用具有长 accountID 参数的那个。这显然会抛出异常声明,即“没有可用的匹配绑定,并且类型不可自绑定”它实际上在尝试生成 IUnitOfWork 时抛出了异常。
如果我注释掉最后三个构造函数,一切正常,并且使用无参数构造函数。如果我注释掉任何两个参数化构造函数,它会尝试使用另一个而不是无参数的构造函数。
Ninject 提供的建议是:
Suggestions:
1) Ensure that you have defined a binding for long.
2) If the binding was defined in a module, ensure that the module has been loaded into the kernel.
3) Ensure you have not accidentally created more than one kernel.
4) If you are using constructor arguments, ensure that the parameter name matches the constructors parameter name.
5) If you are using automatic module loading, ensure the search path and filters are correct.
我们没有任何 1 的东西,因为我们不想。我不确定 2 和 5 是什么意思。我不相信我们已经完成了 3 并且我们没有做 4。
关于为什么在这种情况下不使用无参数构造函数的任何想法。