我使用Ninject3(NuGet安装)的ASP.NET MVC应用程序。解决方案包含:
我正在遵循这样的方法,即在定义绑定的项目中分布许多小模块。两个组合根使用完全相同的绑定。
我无法弄清楚如何为类库中的模块配置范围。例如,给定这些绑定:
Bind<IDomainService1>()
.To<Service1Impl>()
.InSingletonScope(); //This should always be a singleton
Bind<IDomainService2>()
.To<Service2Impl>(); //No scope specified
我总是想要Service1Impl
的单个实例,而Service2Impl
的范围应该取决于所使用的组合根。对于InRequestScope()
,MVC项目应该有Service2Impl
(对于具有未指定范围的所有其他绑定)。调度程序项目不在http上下文中运行,应使用InThreadScope()
。
这种做法是否正确?如果是,配置此行为的正确方法是什么?
答案 0 :(得分:1)
In Ninject, not specifying the scope means InTransientScope()
您的选择是复制绑定或为绑定创建自定义InScope()
范围规则。
最干净的解决方案(特别是假设MVC已经在使用中)是为您创建一个插入InRequestScope()
机制的插件。
有一个CreateScope()
方法,目前在ninject.extensions.namedscope自述文件中有最少的文档,使用like this。它要求您在NuGet中选择“Include Prerelease”。 (而且我应该写一篇关于它的wiki文章,但我的其他东西还有很多......)