使用Ninject DI为API和"定期"在MVC4控制器 [英] Using Ninject DI for both api and "regular" controllers in MVC4
问题描述
可能重复:结果
MVC3 + Ninject - 如何
块引用>在一个小的MVC 4项目,我试图用ninject实现依赖注入。
到目前为止,我有它的API控制器上工作,但我不与常规控制器运气好的话。
我有一个NinjectResolver:
公共类NinjectDependencyResolver:NinjectDependencyScope,的IDependencyResolver
{
私人只读的iKernel _KERNEL; 公共NinjectDependencyResolver(内核的iKernel)
:基地(内核)
{
_KERNEL =内核;
} 公共IDependencyScope BeginScope()
{
返回新NinjectDependencyScope(_kernel.BeginBlock());
} 公共覆盖无效的Dispose()
{
_kernel.Dispose();
}
}和一个NinjectScope:
公共类NinjectDependencyScope:IDependencyScope
{
保护IResolutionRoot ResolutionRoot; 公共NinjectDependencyScope(IResolutionRoot内核)
{
ResolutionRoot =内核;
} 公共对象GetService的(类型的serviceType)
{
VAR请求= ResolutionRoot.CreateRequest(的serviceType,空,新的参数[0],真实,真实);
返回ResolutionRoot.Resolve(要求).SingleOrDefault();
} 公共IEnumerable的<对象> GetServices(类型的serviceType)
{
VAR请求= ResolutionRoot.CreateRequest(的serviceType,空,新的参数[0],真实,真实);
返回ResolutionRoot.Resolve(要求).ToList();
} 公共无效的Dispose()
{
VAR一次性=(IDisposable接口)ResolutionRoot;
如果(一次性!= NULL)disposable.Dispose();
ResolutionRoot = NULL;
}
}然后我把它架在我的Global.asax:
VAR内核=新StandardKernel();
kernel.Bind(typeof运算(IRepository))至(typeof运算(库))。 GlobalConfiguration.Configuration.DependencyResolver =新NinjectDependencyResolver(内核);然后我注入一个库到API控制器是这样的:
私人IRepository _repository;公共TestApiController(IRepository库)
{
_repository =库;
}这工作正常,但在常规控制器做同样的失败,并
错误此对象定义无参数的构造函数。</ P>任何想法?
解决方案ASP.NET MVC使用不同的
的IDependencyResolver
比ASP.NET的WebAPI namellySytem.Web.Mvc.IDependencyResolver
。所以你需要为MVC控制器(幸运的是,MVC和WepAPi
的IDependencyResolver
新的NinjectDependencyResolver
的实施几乎有同样的成员具有相同的签名,所以很容易实现)公共类NinjectMvcDependencyResolver:NinjectDependencyScope,
System.Web.Mvc.IDependencyResolver
{
私人只读的iKernel _KERNEL; 公共NinjectDependencyResolver(内核的iKernel)
:基地(内核)
{
_KERNEL =内核;
}
}然后你可以在里面注册
的Global.asax
与DependencyResolver.SetResolver(新NinjectMvcDependencyResolver(内核));
Possible Duplicate:
MVC3 + Ninject - How to?In a small mvc 4 project, I'm trying to implement dependency injection using ninject.
So far, I have it working with api controllers, but I'm not having any luck with regular controllers.
I have A 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(); } }
And a 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; } }
Then I set it up in my Global.asax:
var kernel = new StandardKernel(); kernel.Bind(typeof(IRepository)).To(typeof(Repository)); GlobalConfiguration.Configuration.DependencyResolver = new NinjectDependencyResolver(kernel);
Then I inject a repository into an api controller like this:
private IRepository _repository; public TestApiController(IRepository repository) { _repository = repository; }
This works fine, but doing the same in a regular controller fails with the "No parameterless constructor defined for this object" error.
Any ideas?
解决方案ASP.NET MVC uses a different
IDependencyResolver
than ASP.NET WebAPi namellySytem.Web.Mvc.IDependencyResolver
.So you need a new
NinjectDependencyResolver
implementation for the MVC Controllers (luckily the MVC and WepAPiIDependencyResolver
almost has the same members with the same signatures, so it's easy to implement)public class NinjectMvcDependencyResolver : NinjectDependencyScope, System.Web.Mvc.IDependencyResolver { private readonly IKernel _kernel; public NinjectDependencyResolver(IKernel kernel) : base(kernel) { _kernel = kernel; } }
And then you can register it in the
Global.asax
with:DependencyResolver.SetResolver(new NinjectMvcDependencyResolver(kernel));
这篇关于使用Ninject DI为API和&QUOT;定期&QUOT;在MVC4控制器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!