如何解决ASP.NET Web API中的依赖注入Ninject
我需要在我的Web API项目中实现class Person
def attributes
[
{ id: 1,nice_attribute: "something" },{ id: 2,nice_attribute: "another thing" },]
end
def find_by_id(id)
attributes.select { |d| d[:id] == id }
end
。我使用DI
时遇到了一些问题。
这是Global.asax:
Ninject
这是ninject的另一个类:
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);
}
}
此代码可以将接口对象发送到public class NinjectRegistrations : NinjectModule
{
public override void Load()
{
Bind<ICountriesRepository>().To<CountriesRepository>();
}
}
,但不能发送到其他控制器。
HomeController
我只需要设置另一个控制器支持即可接收接口对象 因此,感谢您的帮助。
解决方法
您的实现不同于您需要在构造函数上注入内容的实现。
您需要创建一个DependecyResolver才能将其注入到构造函数中。你可以有这样的东西:
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;
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。