我想创建一个独立的类库项目,作为我的组合根。我希望将类型的具体实现保留在项目中,而这些项目从不打算直接使用。如果我被迫在我的MVC Web应用程序中构建我的Ninject注册,这是不可能的。例如,我必须将IAbstraction
映射到ImplementationThatIsNotValidForDirectUseInThisLayer
。
我创建了组合根特定项目并添加了对我所有项目的引用,以便我可以将我的抽象绑定到相应的具体实现。我已将Ninject.MVC5 Nuget包(及其所有依赖项)安装到组合根特定项目中。
当我在我的主MVC5 Web应用程序中引用我的组合根项目时,我可以在Start和Stop方法上设置一个断点并执行代码。这意味着WebActivator
在运行时正确引导这些类。
问题是当我点击一个非参数的控制器时,我得到了可怕的:“没有为这个对象定义无参数构造函数。”错误信息。
为什么不使用Ninject构建控制器及其所有依赖项?我需要做一些额外的配置吗?
我有一个从MyApp.WebApp
到MyApp.WebApp.CompositionRoot.Ninject
项目的项目引用,其中正在配置我的所有绑定。
只有当初始ASP.NET项目是从Visual Studio中的Empty项目模板创建的时候才会出现问题(我使用的是2013年的价值),并通过Nuget添加了MVC。如果我使用MVC模板创建ASP.NET Web应用程序并将我的组合根保存在MVC应用程序引用的外部类库中,则控制器由Ninject正确构造。我查看了从MVC模板创建的项目,唯一缺少的可能重要的参考是“System.Web.Abstractions。我添加了引用,但它没有解决问题。
答案 0 :(得分:0)
我决定在单独的组合根类库项目中定义我的Ninject模块,但是将Ninject.MVC5 Nuget包安装到Web应用程序中。保持Web应用程序不具备具体实现的目标,但我必须在MVC Web应用程序中保留对Ninject的一些引用。这是一个小问题,至少这可以维护我的分层架构,并保证不能在不需要的地方使用类型(当然不添加引用!)。