2012-08-31 25 views
4

可能重复:
MVC3 + Ninject - How to?使用Ninject DI两个API和MVC4 “常规” 控制器

在一个小型MVC 4项目,我想使用来实现依赖注入ninject。到目前为止,我已经使用api控制器,但我对常规控制器没有任何好运。

我有一个NinjectResolver:

public class NinjectDependencyResolver : NinjectDependencyScope, IDependencyResolver 
    { 
     private readonly IKernel _kernel; 

     public NinjectDependencyResolver(IKernel kernel) 
      : base(kernel) 
     { 
      _kernel = kernel; 
     } 

     public IDependencyScope BeginScope() 
     { 
      return new NinjectDependencyScope(_kernel.BeginBlock()); 
     } 

     public override void Dispose() 
     { 
      _kernel.Dispose(); 
     } 
    } 

并有NinjectScope:

public class NinjectDependencyScope : IDependencyScope 
    { 
     protected IResolutionRoot ResolutionRoot; 

     public NinjectDependencyScope(IResolutionRoot kernel) 
     { 
      ResolutionRoot = kernel; 
     } 

     public object GetService(Type serviceType) 
     { 
      var request = ResolutionRoot.CreateRequest(serviceType, null, new Parameter[0], true, true); 
      return ResolutionRoot.Resolve(request).SingleOrDefault(); 
     } 

     public IEnumerable<object> GetServices(Type serviceType) 
     { 
      var request = ResolutionRoot.CreateRequest(serviceType, null, new Parameter[0], true, true); 
      return ResolutionRoot.Resolve(request).ToList(); 
     } 

     public void Dispose() 
     { 
      var disposable = (IDisposable)ResolutionRoot; 
      if (disposable != null) disposable.Dispose(); 
      ResolutionRoot = null; 
     } 
    } 

然后,我把它架在我的Global.asax:

var kernel = new StandardKernel(); 
      kernel.Bind(typeof(IRepository)).To(typeof(Repository)); 

      GlobalConfiguration.Configuration.DependencyResolver = new NinjectDependencyResolver(kernel); 

然后我注入库到像这样的api控制器:

private IRepository _repository; 

public TestApiController(IRepository repository) 
{ 
    _repository = repository; 
} 

这可以正常工作,但在常规控制器中执行相同操作会失败 “没有为此对象定义无参数构造函数”错误。

任何想法?

回答

5

ASP.NET MVC使用与ASP.NET WebAPi名称Sytem.Web.Mvc.IDependencyResolver不同的IDependencyResolver

所以你需要一个新的NinjectDependencyResolver实现了MVC控制器(幸运的是,MVC和WepAPi IDependencyResolver几乎具有相同的签名相同的成员,所以很容易实现)

public class NinjectMvcDependencyResolver : NinjectDependencyScope, 
              System.Web.Mvc.IDependencyResolver 
{ 
    private readonly IKernel _kernel; 

    public NinjectDependencyResolver(IKernel kernel) 
     : base(kernel) 
    { 
     _kernel = kernel; 
    } 
} 

然后你就可以注册它在Global.asax与:

DependencyResolver.SetResolver(new NinjectMvcDependencyResolver(kernel)); 
+3

1.如果这是该类的整个实现,为什么你要将'kernel'存储在一个字段? 2.你不能让基类实现两个接口吗? – MEMark