2012-05-14 36 views
7

返回同一个实例最近,我升级我的MVC3项目从Ninject 2至3 NinjectNinject 3 InRequestScope不相同请求

之一几分钟试图找到为什么InRequestScope是不再使用后,我发现这是Ninject.Web.Common的扩展。现在,当我尝试运行应用程序时,Ninject的工作原理就好像所有绑定范围InRequest的类型都是InTransientScope;每次都创建一个新实例。

以我类从NinjectModule继承,我有一个简单绑定这样的:

Bind<ViewModel.Activity>().ToSelf().InRequestScope(); 

以我控制器,I有标有Ninject属性类型ViewModel.Activity的2个属性。

[Inject] 
    public ViewModel.Activity Activity { get; set; } 

    [Inject] 
    public ViewModel.Activity Activity1 { get; set; } 

如果我在调试模式下都看着这两个属性的hashCode的价值,也都有着不同的价值,但HttpContext的是相同的;我在同一个请求。

我错过了如何正确使用新版Ninject 3的新Ninject.Web.Common.InRequestScope?

非常感谢。

+0

你如何将Ninject连接到你的代码?您是否使用nuget中的Ninject.MVC3,然后编辑NinjectWebCommon.cs文件?或者你在做自定义控制器工厂? –

+0

定制工厂 – Samuel

+0

@MystereMan非常感谢。这正是我想要的。我使用NuGet来查找Ninject MVC3,并在NinjectWebCommon中添加您所说的绑定我的依赖关系的工具。我认为这项工作的关键在于以下几行:DynamicModuleUtility.RegisterModule(typeof(OnePerRequestHttpModule));和DynamicModuleUtility.RegisterModule(typeof(NinjectHttpModule)); OnePerRequestHttpModule也将在每次请求后立即处理我的所有工作单元。非常感谢你! – Samuel

回答

9

添加一个答案所以这可以关闭的

不要使用自定义的工厂。只需安装Ninject.MVC3并将绑定复制到NinjectWebCommon.cs文件中,然后删除所有旧代码。

+0

在答案的开头添加了什么评论? – Samuel

+0

@Samuel - 我原本是以评论形式发布这篇文章的,但是你要求我将它发布为答案,以便将其标记为答案。所以我做到了,事实上你确实将它标记为答案。然后,出于某种原因,你突然决定取消它作为答案。 –

+0

对不起,我的错。 – Samuel

7

Ninject.Web.Common不能单独使用。你必须使用一些额外的web或wcf扩展或自己实现InRequestScope。

+0

谢谢Remo你的时间。你有一个如何实现它的代码样本。在我的模块中,我使用了我希望注入的类型的绑定语法,并且在使用ninject.web.common的帮助下,我在绑定指令的末尾调用了InRequestScope方法。它不足以告诉ninject我想要什么范围? – Samuel

+1

没有那么不够,因为InRequestScope可能意味着InWCFRequestScope或InHttpRequestScope,并且在将来也可以适用于其他范围。 Web.Common不知道任何有关各种请求类型的信息。我强烈建议使用其中一个Web扩展。没有理由实施自己的工厂,我也不给予任何支持。如果您真的想使用自己的工厂,请查看扩展并从那里复制所有逻辑。 –

+0

嗨雷莫,谢谢你的帮助。我搜索了扩展和谷歌'InHttpRequestScope',但我没有找到任何信息帮助我实现InHttpRequestScope。在哪个扩展中我可以找到这种方法,类? – Samuel

相关问题