一、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 的其中一种方式。