ASP.NET Web API(Ninject)中的依赖项注入



我需要在我的Web API项目中实现DI。我正在使用Ninject,遇到了一个小问题。

这是Global。asax:

public class WebApiApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
NinjectModule registrations = new NinjectRegistrations();
var kernel = new StandardKernel(registrations);
DependencyResolver.SetResolver(new NinjectDependencyResolver(kernel));
AreaRegistration.RegisterAllAreas();
GlobalConfiguration.Configure(WebApiConfig.Register);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
}
}

这是ninject的另一个类

public class NinjectRegistrations : NinjectModule
{
public override void Load()
{
Bind<ICountriesRepository>().To<CountriesRepository>();
}
}

此代码可以将Interface对象发送到HomeController,但不能发送到其他控制器。

public class CountriesController : ApiController
{
public ICountriesRepository db;
// CONSTRUCTOR DO NOT RECEIVE AN INTERFACE OBJECT
public CountriesController(ICountriesRepository a)     // CONSTRUCTOR DO NOT RECIEVE AN INTERFACE OBJECT
{  
db = a;
}
}

我只需要设置另一个控制器支持,就可以接收Interface对象所以,我会感谢你的帮助。

您的实现与在构造函数中注入某些内容所需的实现不同。

您需要创建一个DependencyResolver来将其注入构造函数。你可以有这样的东西:

public class NinjectRegistrations : NinjectModule
{
public override void Load()
{
Bind<IProductRepository>().To<ProductRepository>();
}
}

public class NinjectDependencyResolver : NinjectDependencyScope, IDependencyResolver, System.Web.Mvc.IDependencyResolver
{
private readonly IKernel kernel;
public NinjectDependencyResolver(IKernel kernel)
: base(kernel)
{
this.kernel = kernel;
}
public IDependencyScope BeginScope()
{
return new NinjectDependencyScope(this.kernel.BeginBlock());
}
}

public class NinjectDependencyScope : IDependencyScope
{
private IResolutionRoot resolver;
internal NinjectDependencyScope(IResolutionRoot resolver)
{
Contract.Assert(resolver != null);
this.resolver = resolver;
}
public void Dispose()
{
var disposable = this.resolver as IDisposable;
if (disposable != null)
{
disposable.Dispose();
}
this.resolver = null;
}
public object GetService(Type serviceType)
{
if (this.resolver == null)
{
throw new ObjectDisposedException("this", "This scope has already been disposed");
}
return this.resolver.TryGet(serviceType);
}
public IEnumerable<object> GetServices(Type serviceType)
{
if (this.resolver == null)
{
throw new ObjectDisposedException("this", "This scope has already been disposed");
}
return this.resolver.GetAll(serviceType);
}
}

在您的Global.asax

NinjectModule registrations = new NinjectRegistrations();
var kernel = new StandardKernel(registrations);
var ninjectResolver = new NinjectDependencyResolver(kernel);
// If you are using MVC
DependencyResolver.SetResolver(ninjectResolver);
// If you are using API
GlobalConfiguration.Configuration.DependencyResolver = ninjectResolver;

最新更新