以下是该方案。我有一个WCF服务,当调用此服务时,它将控制权传递给另一个类的实例(通过Ninject创建)。在那个课程中,我需要做一些工作,特别是实体框架和存储库。简而言之,我声明了以下绑定。
Bind<IGenericProductRepository>()
.To<GenericProductRepository>()
.WithConstructorArgument( "context", new StagingDataContext());
当我想使用此存储库时,我有以下内容。
using (var genericProductRepository = IoC.Resolve<IGenericProductRepository>())
问题是,如果它是一个全新的请求,我只获得了一个新的genericProductRepository实例,如果在同一个请求中多次调用该方法,我会收到一条错误,指出已经处理了上下文(EF上下文) ,这是因为我似乎得到了已经在using语句中处理的相同实例。为了解释另一种方式,使用Microsoft WCF测试客户端,如果我第一次调用它,代码运行正常,如果我再次按下调用按钮(不重新启动测试客户端,即相同的请求)然后它会抛出此错误关于它已被处置。
我试图使用Ninject附带的各种“范围”,但很明显我错过了一些东西。
所以我的基本问题是,如何在遇到该行时获取新的存储库,而不是使用相同的存储库?非常感谢帮助,我真的想推动我的公司采用Ninject并放弃Spring。
答案 0 :(得分:3)
再次看看你的装订。即使不了解Ninject,您也应该注意到在定义绑定时只创建了一次上下文实例。但是你想要的是每个决心都有一个新的背景。最好的方法是不使用WithConstructorArgument并让Ninject创建实例。因此,您必须为上下文类型定义其他绑定。如果由于某种原因这是不可能的,你必须使用惰性版本的WithConstructorArgument
WithConstructorArgument("context", ctx => new StagingDataContext())
此外,您可能想尝试Ninject的WCF扩展: https://github.com/ninject/ninject.extensions.wcf
这样你就可以像使用一样摆脱ServiceLocator。