【.Net】Ninject使用记录

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]这样的特性,需要构造函数注入

WebApi配置方法

原文地址:https://www.cnblogs.com/Locked-J/p/7722864.html