gpt4 book ai didi

asp.net-mvc-4 - 在 MVC4 中对 api 和 "regular" Controller 使用 Ninject DI

转载 作者:行者123 更新时间:2023-12-05 01:22:29 24 4
gpt4 key购买 nike

这个问题在这里已经有了答案:




9年前关闭。




Possible Duplicate:
MVC3 + Ninject - How to?



在一个小型 mvc 4 项目中,我正在尝试使用 ninject 实现依赖注入(inject)。

到目前为止,我已经将它与 api Controller 一起使用,但我对常规 Controller 没有任何运气。

我有一个 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);

然后我将一个存储库注入(inject)到一个 api Controller 中,如下所示:
private IRepository _repository;

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

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

有任何想法吗?

最佳答案

ASP.NET MVC 使用不同的 IDependencyResolver比 ASP.NET WebAPI 即 Sytem.Web.Mvc.IDependencyResolver .

所以你需要一个新的NinjectDependencyResolver MVC Controller 的实现(幸运的是,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));

关于asp.net-mvc-4 - 在 MVC4 中对 api 和 "regular" Controller 使用 Ninject DI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12212561/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com