ASP.NET MVC3 和 MVC4 中 Ninject 的依赖注入

一、ASP.NET MVC3 中 用 Ninject 进行依赖注入

1 自定义一个继承自 IDependencyResolver 的类

重写其中的 GetService 和 GetServices 方法,MVC Framework 在实例化 Controller 时会调用 GetService 方法。

  public interface IDependencyResolver

  {
        object GetService(Type serviceType);
        IEnumerable<object> GetServices(Type serviceType);
  }

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);
 }
 
 public IBindingToSyntax<T> Bind<T>()
 {
  return kernel.Bind<T>();
 }
 
 public IKernel Kernel
 {
  get { return kernel; }
 }

// 在这里注入我们想要的对象
 private void AddBindings()
 {
   kernel.Bind<IProductRepository>().To<ProductRepository>();
 }
}

2 在 Application_Start() 中注册自定义的 NinjectDependencyResolver
DependencyResolver.SetResolver(new NinjectDependencyResolver());

这样就可以由 Ninject 来实例化 Controller ,并注入我们想要注入的对象。

 

二、ASP.NET MVC4 中 用 Ninject 进行依赖注入

 1 定义一个继承自 IDependencyScope 的类 并重写它的 GetService 和 GetServices 方法

  public interface IDependencyScope : IDisposable
  {
    object GetService(Type serviceType);
    IEnumerable<object> GetServices(Type serviceType);
  }

 public interface IDependencyResolver : IDependencyScope, IDisposable
  {
    IDependencyScope BeginScope();
  }

 

可以看到 IDependencyResolver 有一个 BeginScope 方法,该方法返回一个 IDependencyScope 对象,

 MVC Framework 在实例化 Controller 时会调用 IDependencyResolver 的 BeginScope 方法得到一个 IDependencyScope 对象,

然后调用该对象的 GetService 方法实例化 Controller 对象。

 

 public class NinjectWebApiScope:IDependencyScope
    {
        protected IResolutionRoot resolutionRoot;

        public NinjectWebApiScope(IResolutionRoot resolutionRoot)
        {
            this.resolutionRoot = resolutionRoot;
        }

        public object GetService(Type serviceType)
        {
            return resolutionRoot.Resolve(this.CreateRequest(serviceType)).SingleOrDefault();
        }

        public IEnumerable<object> GetServices(Type serviceType)
        {
            return resolutionRoot.Resolve(this.CreateRequest(serviceType));
        }

        private IRequest CreateRequest(Type serviceType)
        {
            return resolutionRoot.CreateRequest(serviceType, null, new Parameter[0], true, true);
        }

        public void Dispose()
        {
            resolutionRoot = null;
        }
    }

2 定义自己的 DependencyResolver 类

 public class NinjectWebApiResolver:NinjectWebApiScope,IDependencyResolver
    {
        private IKernel kernel;

        public NinjectWebApiResolver(IKernel kernel):base(kernel)
        {
            this.kernel = kernel;
            AddBindings();
        }

        private void AddBindings()   // 这里注入我们的对象
        {
            kernel.Bind<IProductRepository>().To<ProductRepository>();
        }

        public IDependencyScope BeginScope()
        {
            return new NinjectWebApiScope(kernel.BeginBlock());
        }
    }

3   在 Application_Start() 中注册到全局
    Ninject.IKernel kernel = new StandardKernel();
    GlobalConfiguration.Configuration.DependencyResolver = new NinjectWebApiResolver(kernel);

 

MVC Framwork 非常的灵活,几乎每一个 component 都可以定制,这里只是进行 DI 的其中一种方式。

 

 

你可能感兴趣的:(asp.net)