Ninject 3中的InRequestScope对于相同请求不返回相同的实例

10

最近,我将我的一个MVC3项目从Ninject 2升级到了Ninject 3。

花了几分钟时间尝试找出为什么InRequestScope不再可用后,我发现这现在是Ninject.Web.Common的扩展。

现在,当我尝试运行应用程序时,Ninject的工作方式就像将所有绑定到InRequest范围的类型都绑定到InTransientScope一样;每次都会创建一个新实例。

在我的继承自NinjectModule的类中,我有一个简单的绑定,像这样:

Bind<ViewModel.Activity>().ToSelf().InRequestScope();
在我的控制器中,我有两个被标记为Ninject属性的ViewModel.Activity类型属性。
  [Inject]
  public ViewModel.Activity Activity { get; set; }

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

如果我在调试模式下查看这两个属性的HashCode值,它们都有不同的值,但HttpContext是相同的;我在同一个请求中。

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

非常感谢。


你是如何将Ninject集成到你的代码中的?你是使用NuGet中的Ninject.MVC3,然后编辑NinjectWebCommon.cs文件吗?还是你在使用自定义控制器工厂? - Erik Funkenbusch
@MystereMan 非常感谢。这正是我想要的。我使用NuGet找到了Ninject MVC3,只需按照您在NinjectWebCommon中所说的绑定我的依赖项即可运行。我认为这能够工作的关键是因为这些代码行:DynamicModuleUtility.RegisterModule(typeof(OnePerRequestHttpModule)); 和 DynamicModuleUtility.RegisterModule(typeof(NinjectHttpModule)); OnePerRequestHttpModule还将立即在每个请求之后处理所有我的工作单元。非常感谢! - Samuel
2个回答

10

作为回答添加以便关闭此问题

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


这个注释是在答案开头添加的是什么? - Samuel
@Samuel - 我最初将这篇文章发布为评论,但你要求我将其发布为答案以便标记为答案。所以我这样做了,你确实将其标记为答案。然后,出于某种原因,你突然决定取消对它的标记。 - Erik Funkenbusch

7

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


谢谢Remo抽出时间来。你有实现它的代码示例吗?在我的模块中,我使用绑定语法来注入所需类型,并借助using ninject.web.common,在绑定指令的末尾调用InRequestScope方法。这样告诉ninject我想要哪个范围不就足够了吗? - Samuel
1
不,这还不够,因为InRequestScope可能意味着InWCFRequestScope或InHttpRequestScope,将来可能还会有其他作用域。Web.Common对各种请求类型一无所知。我强烈建议使用其中一个Web扩展。没有理由实现自己的工厂,我也不提供任何支持。如果您真的想使用自己的工厂,请查看扩展并从中复制所有逻辑。 - Remo Gloor
嗨 Remo,谢谢你的帮助。我查找了扩展和Google“ InHttpRequestScope”,但我没有找到任何有助于我实现InHttpRequestScope的信息。在哪个扩展中可以找到这个方法或类? - Samuel
@Samuel 你看过 Ninject.Extension.Mvc* 和 Ninject.Extensions.Wcf 吗? - Ruben Bartelink
谢谢大家。就像我在评论中对MystereMan所说的那样,包括使用NuGet引用Ninject MVC3,这解决了我所有的问题。 - Samuel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接