3

这是场景。我有一个 WCF 服务,当调用此服务时,它会将控制权传递给另一个类的实例(通过 Ninject 创建)。在那个类中,我需要做一些工作,特别是实体框架和存储库。长话短说,我声明了以下绑定。

Bind<IGenericProductRepository>()
    .To<GenericProductRepository>()
    .WithConstructorArgument( "context", new StagingDataContext());

当我想使用这个存储库时,我有以下内容。

using (var genericProductRepository = IoC.Resolve<IGenericProductRepository>())

问题是,如果它是一个全新的请求,我只会得到一个新的 genericProductRepository 实例,如果在同一个请求中多次调用该方法,我会收到一个错误,指出上下文(EF 上下文)已经被释放,这是因为似乎我正在获取已在 using 语句中处理的相同实例。用另一种方式解释它,使用 Microsoft WCF 测试客户端,如果我第一次调用它,代码运行良好,如果我再次按下调用按钮(不重新启动测试客户端,即相同的请求)然后它抛出这个错误关于它已经被处置了。

我试图玩弄 Ninject 附带的各种“范围”,但显然我错过了一些东西。

所以我的基本问题是,当它到达那条线时,我如何获得一个新的存储库,而不是使用同一个?非常感谢您的帮助,我真的在努力推动我的公司采用 Ninject 并放弃 Spring。

4

1 回答 1

3

再看看你的装订。即使没有任何关于 Ninject 的知识,您也应该注意到您的上下文实例在定义绑定时仅创建一次。但是你想要的是每一个决心都有一个新的背景。最好不要使用 WithConstructorArgument 并让 Ninject 创建实例。因此,您必须为上下文类型定义一个附加绑定。如果由于某种原因这是不可能的,你必须使用 WithConstructorArgument 的惰性版本

WithConstructorArgument("context", ctx => new StagingDataContext())

此外,您可能想尝试 Ninject 的 WCF 扩展: https ://github.com/ninject/ninject.extensions.wcf

这样你就可以摆脱 ServiceLocator 之类的使用。

于 2011-03-30T08:41:38.113 回答