【发布时间】:2016-02-19 23:58:53
【问题描述】:
我对 IoC 框架还很陌生,所以请原谅这些术语。
所以我拥有的是一个带有 Nininject MVC 引用的 MVC 项目。
我的项目中有其他类库,例如领域层,我希望能够在其中使用 Ninject 框架,但我所有的绑定都在 MVC 项目的 App_Start 文件夹下的 NinjectWebCommon.cs 中:
private static void RegisterServices(IKernel kernel)
{
kernel.Bind<IHardwareService>().To<WindowsHardwareService>();
kernel.Bind<IStatusApi>().To<StatusApiController>();
}
目前在我的类库中,我正在使用构造函数注入,但有时我不得不对依赖项进行硬编码:
var service = new WindowsHardwareService();
当我希望能够执行以下操作时:
IKernel kernel = new StandardKernel(.....);
var context = kernel.Get<IHardwareService>();
因为我没有任何模块,所以我没有执行以下操作? 我阅读的所有文档主要针对的是常规的 Ninject 库,而不是 MVC 版本。
我需要做什么,如何在 MVC 版本中使用常规的 Ninject 库?
更新
这是我尝试过的:
这样做的目的是让每个项目都可以加载模块并获得当前注入的接口。
App_Start/NinjectWebCommon.cs(在 MVC 项目中)
private static void RegisterServices(IKernel kernel)
{
var modules = new IoCModules();
var newKernal = modules.GetKernel();
kernel = newKernal;
}
IoCModules.cs(在 Project.Ioc 项目中)
public class IoCModules
{
public IKernel GetKernel()
{
var modules = new CoreModule();
return modules.Kernel;
}
}
CoreModule.cs(在 Project.IoC.Modules 项目中)
public class CoreModule : NinjectModule
{
public override void Load()
{
Bind<IHardwareService>().To<WindowsHardwareService>();
Bind<IStatusApi>().To<StatusApiController>();
}
}
但我目前得到以下信息:
激活 IHardwareService 时出错
没有匹配的绑定可用,并且类型不是自绑定的。 激活路径:
2) 将依赖IHardwareService注入到DashboardController类型的构造函数的参数服务中
1) DashboardController 的请求
建议:
1) 确保您已为 IHardwareService 定义绑定。
2) 如果绑定是在模块中定义的,请确保该模块已加载到内核中。
3) 确保您没有意外创建多个内核。
4) 如果您使用构造函数参数,请确保参数名称与构造函数参数名称匹配。
5) 如果您使用自动模块加载,请确保搜索路径和过滤器正确。
【问题讨论】:
-
请see the following answer。我认为它达到了相似的点,会帮助你:)。
-
@Coulton 感谢您的建议,但它并没有真正回答,我不想使用属性注入,我能够将 Ninject MVC 与其他类库一起使用,这可能包括移动我的绑定到更“常见”的地方。
-
好的,没问题。如果不是属性或构造函数注入,你想做什么样的注入?
-
问题是关于如何为您自己的注册创建 ninject 模块以及从哪里放置和引用它们?
-
@kayess 是的,我不希望我的 UI 项目引用所有内容,因为我需要在其中添加绑定,我需要一个引用 Ninject 的“通用”项目才能使用它解决方案中的任何地方,同时保持 Ninject MVC 部分正常工作。
标签: c# asp.net-mvc ninject ioc-container