Ninject的使用
有三种注入节点,根据个人理解,三种节点注入都可以使用,应该是注入的时机不同。
MVC的三种IoC注入点的Ninject实现
根据目前使用情况,建议使用NinjectDependencyResolver
来注入,ControllerFactory节点注入的话,控制器也会使用注入来实例化,当请求的路径不存在的时候,不能正常的抛出HttpNotFoundException
响应404,而是报System.InvalidOperationException
,使用NinjectDependencyResolver
来注入就省去自己处理的麻烦了。
注:Asp.Net MVC5的控制器不能设为单例,不像SpringMVC的Servlet,所以感觉管理控制器的注入没有很大的必要。
MVC5配置如下:
- 引入
Ninject.dll
- 添加
NinjectDependencyResolver.cs
或者其他两种
public class NinjectDependencyResolver : IDependencyResolver
{
private IKernel kernel;
public NinjectDependencyResolver()
{
kernel = new StandardKernel(); // 有些人的配置有点区别
AddBindings();
}
public object GetService(Type serviceType)
{
return kernel.TryGet(serviceType);
}
public IEnumerable<object> GetServices(Type serviceType)
{
return kernel.GetAll(serviceType);
}
private void AddBindings()
{
// 绑定对应仓库
kernel.Bind<ISchoolRepository>().To<SchoolRepository>();
// 绑定对应服务
kernel.Bind<ISchoolService>().To<SchoolService>();
}
}
- 修改Global.asax,
Application_Start
中后面添加:
DependencyResolver.SetResolver(new NinjectDependencyResolver());
- 在需要的地方为注入属性,添加注入构造函数或者[Inject]特性,属性要求public
public class AController : Controller
{
[Inject]
public ISchoolService schoolService { get; set; }
// ...
}
注:
- 这里引用不需要添加其他的,那些
Ninject.Web.Common
什么的,只是做了层设置的封装,这里简单就不需要加了 - 如果出现空引用的情况,先检查属性是否为
public
,其次AddBindings(){}
内是否有注入的类没有绑定的!不一定是报空的类! - 每次都需要自己手动添加依赖绑定到
AddBindings()
,有点麻烦,AutoFac可以自动绑定依赖,就是没有[Inject]
这样的特性,需要构造函数注入