Ninject在WCF中无法使用构造函数参数创建新实例

3

以下是情景描述。我有一个WCF服务,当调用此服务时,它会将控制权传递给另一个类的实例(通过Ninject创建)。在那个类中,我需要做一些工作,具体来说是使用Entity Framework和repositories。为了简化故事,我声明了以下绑定。

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

当我想使用这个代码库时,我需要执行以下步骤。
using (var genericProductRepository = IoC.Resolve<IGenericProductRepository>())

问题在于,如果它是一个全新的请求,我只会得到genericProductRepository的一个新实例,如果在同一个请求中多次调用该方法,则会出现错误,指出上下文(EF上下文)已经被处理,这是因为似乎返回了已经在using语句中处理过的相同实例。换句话说,使用Microsoft WCF测试客户端时,如果我第一次调用它,代码运行正常,如果我再次点击调用按钮(而不重新启动测试客户端,即相同的请求),则会抛出关于它已被处理的错误。
我已经尝试过玩弄与Ninject一起提供的各种“作用域”,但显然我漏掉了某些东西。
所以我的基本问题是,如何在每次到达那一行时获得一个新的repository,而不是使用同一个?非常感谢您的帮助,我真的很想推动我们公司采用Ninject并放弃Spring。
1个回答

3

再次查看你的绑定。即使没有关于Ninject的任何知识,你也应该注意到在定义绑定时上下文的实例仅被创建一次。但是你想每次解析时都有一个新的上下文。最好的方法是不使用WithConstructorArgument让Ninject创建实例。因此,你必须为上下文类型定义一个额外的绑定。如果出于某些原因无法这样做,则必须使用WithConstructorArgument的延迟版本。

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

另外,您可能想尝试Ninject的WCF扩展: https://github.com/ninject/ninject.extensions.wcf 这样您就可以摆脱类似使用ServiceLocator的情况。

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