ASP.NET MVC + Ninject:InRequestScope [英] ASP.NET MVC + Ninject: InRequestScope
问题描述
我想使用ninject InRequestScope创建PerRequestResourceProvider的实例:
I want to create instance of PerRequestResourceProvider using ninject InRequestScope:
public class PerRequestResourceProvider: IPerRequestResourceProvider
{
priavte readonly _perRequestResorceInstance;
public PerRequestResourceProvider()
{
_perRequestResorceInstance = new PerRequestResource();
}
public PerRequestResource GetResource()
{
return _perRequestResorceInstance;
}
}
public interface IPerRequestResourceProvider
{
PerRequestResource GetResource();
}
在我的NinjectDependencyResolver中:
In my NinjectDependencyResolver:
.....
kernel.Bind<IPerRequestResourceProvider>.To<PerRequestResourceProvider>().InRequestScope();
我在几个类中注入IPerRequestResourceProvider.但是,当我向PerRequestResourceProvider构造函数添加断点时,我看到PerRequestResourceProvider在一个请求期间创建了3次,而不是每个请求创建一个.怎么了?
I inject IPerRequestResourceProvider in few classes. But when I add breakpoint to PerRequestResourceProvider constructor I see that PerRequestResourceProvider is created three times during one request and not single per request. What's wrong?
更新:源代码ttps://bitbucket.org/maximtkachenko/ninjectinrequestscope/src
Update: source code ttps://bitbucket.org/maximtkachenko/ninjectinrequestscope/src
推荐答案
您的代码有两个问题:
-
Ninject未正确初始化. 您需要一个Ninject.MVCx软件包(根据您使用的MVC版本).要正确配置它,请参阅: http://github.com/ninject/ninject.web.mvc
Ninject is not getting initialized correctly. You need one of the Ninject.MVCx packages (according to the MVC version you are using). To configure it correctly, see: http://github.com/ninject/ninject.web.mvc
您正在将PerRequestResourceProvider
(类类型)而不是IPerRequestResourceProvider
(接口类型)注入到HomeController
中,因此在IPerRequestResourceProvider
绑定上定义的.InRequestScope()
无效. .更改HomeController
构造函数以注入接口类型,您就很好.
You are injecting PerRequestResourceProvider
(the class type), and not IPerRequestResourceProvider
(the interface type) into HomeController
, thus the .InRequestScope()
defined on the IPerRequestResourceProvider
binding is not taking any effect. Change the HomeController
constructor to get the inteface type injected and you're good.
Ninject不需要对可实例化(非抽象,..)类进行绑定.这就是为什么使用错误的绑定时并不明显的原因.
Ninject does not require bindings for instantiatable (non-abstract,..) classes. This is why it is not obvious when the wrong binding is used.
这篇关于ASP.NET MVC + Ninject:InRequestScope的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!