在我的MVC3项目中,我已经在InRequestScope的基础上将我的内核设置为Ninject Entityframework上下文,这非常有效,但是我有一个后台运行器来执行一些工作流管理.
它每5分钟启动一个新线程,我将我的依赖项Ninject到这个线程中,如果我将范围更改为InThreadScipe,则会触发Dispose方法,但如果我将其更改回InRequestScope,则Dispose方法不会触发.
如果InRequestScope不可用,是否有退回InThreadScope的方法?
更新:刚刚得到一个关于这个问题的upvote,为什么不用一些额外的信息更新它.我认为Ninjects处理生命时间的方式有点过时了.其他IoC的子容器是Transient注册的对象,它们存放在整个子容器中,并在子容器处理时被丢弃.这是一种更简单的方法,例如Web API与上述方案之类的自定义工作程序相结合.
Rub*_*ink 14
有一种InScope方法,您可以使用该方法指定自定义范围规则.
InRequestScope的实施目前正在从2.2-2.4进行改变.
所以去你的版本的源代码,看的IMPL InRequestScope和InThreadScope创造的汞合金(然后你就可以在插槽作为扩展方法旁边的其他InXXXScope方法.
它看起来(在你将其提取到扩展方法之前)类似于:
Bind<X>.To<T>().InScope( ctx => ScopeContext.Request(ctx) ?? ScopeContext.Thread(ctx))
Run Code Online (Sandbox Code Playgroud)
另一种方法是创建两个Bind,具有适当的约束,例如WhenInjectedInto<T>基于上下文绑定自定义范围.
感谢Ruben,我找到了一个解决方案,但是在他的伪代码中潜入了一个小虫子,因为它是星期一而且我很累,我没有马上看到它:D
StandardScopeCallbacks.Request
Run Code Online (Sandbox Code Playgroud)
是代表和
StandardScopeCallbacks.Request ?? StandardScopeCallbacks.Thread
Run Code Online (Sandbox Code Playgroud)
将始终返回左侧,因为委托永远不会为空.
有两种方法可以正确地执行此操作,
public static IBindingWhenInNamedWithOrOnSyntax<T> InRequestFallbackScope<T>(this IBindingWhenInNamedWithOrOnSyntax<T> binding)
{
Func<IContext, object> fallbackCallback = ctx => StandardScopeCallbacks.Request(ctx) ?? StandardScopeCallbacks.Thread(ctx);
binding.Binding.ScopeCallback = fallbackCallback;
return binding;
}
Run Code Online (Sandbox Code Playgroud)
.InScope(ctx => StandardScopeCallbacks.Request(ctx) ?? StandardScopeCallbacks.Thread(ctx))
Run Code Online (Sandbox Code Playgroud)