【发布时间】:2012-07-25 15:08:29
【问题描述】:
在我提出问题之前,您应该知道我从这个页面获得了我当前的代码: http://www.strathweb.com/2012/05/using-ninject-with-the-latest-asp-net-web-api-source/
我正在尝试通过使用上述网站上的 IDependencyResolver 适配器在我的应用程序中使用 ASP.NET Web API 和 Ninject。
我创建了所有代码,就像它在网站上显示的那样,它可以工作,但是当我加载我的应用程序时,我的常规控制器失败并显示此错误:
[MissingMethodException: No parameterless constructor defined for this object.][InvalidOperationException: An error occurred when trying to create a controller of type 'AccountManager.Controllers.HomeController'...
所以,我似乎可以将 Ninject 与常规控制器或 Web API 控制器一起使用,但不能同时使用两者。 :(
这是我的代码:
NinjectResolver.cs
public class NinjectResolver : NinjectScope, IDependencyResolver
{
private IKernel _kernel;
public NinjectResolver(IKernel kernel)
: base(kernel)
{
_kernel = kernel;
}
public IDependencyScope BeginScope()
{
return new NinjectScope(_kernel.BeginBlock());
}
}
NinjectScope.cs
public class NinjectScope : IDependencyScope
{
protected IResolutionRoot resolutionRoot;
public NinjectScope(IResolutionRoot kernel)
{
resolutionRoot = kernel;
}
public object GetService(Type serviceType)
{
IRequest request = resolutionRoot.CreateRequest(serviceType, null, new Parameter[0], true, true);
return resolutionRoot.Resolve(request).SingleOrDefault();
}
public IEnumerable<object> GetServices(Type serviceType)
{
IRequest request = resolutionRoot.CreateRequest(serviceType, null, new Parameter[0], true, true);
return resolutionRoot.Resolve(request).ToList();
}
public void Dispose()
{
IDisposable disposable = (IDisposable)resolutionRoot;
if (disposable != null) disposable.Dispose();
resolutionRoot = null;
}
}
Global.asax.cs
public class MvcApplication : System.Web.HttpApplication
{
private void SetupDependencyInjection()
{
//create Ninject DI Kernel
IKernel kernel = new StandardKernel();
//register services with Ninject DI container
RegisterServices(kernel);
//tell asp.net mvc to use our Ninject DI Container
GlobalConfiguration.Configuration.DependencyResolver = new NinjectResolver(kernel);
}
}
AccountingController.cs
public class AccountingController : ApiController
{
private ICustomerService _customerService;
public AccountingController(ICustomerService service)
{
_customerService = service;
}
// GET /api/<controller>/5
public string Get(int id)
{
return "value";
}
}
【问题讨论】:
-
之前没用过 Ninject,但是有什么原因你不能在 Ninject 试图注入的类型上添加无参数构造函数?
-
@Charleh:这将违背 IoC 容器的目的。
标签: c# asp.net-mvc ninject