如何(不)使用Ninject3在类库中指定范围

时间:2013-05-18 14:33:11

标签: asp.net-mvc ninject ninject.web.mvc

我使用Ninject3(NuGet安装)的ASP.NET MVC应用程序。解决方案包含:

  • MVC项目(组合根);
  • 域模型项目;
  • 数据层项目;
  • 一个调度程序项目(在Windows服务中运行预定作业并持有替代组合根);
  • 其他一些项目。

我正在遵循这样的方法,即在定义绑定的项目中分布许多小模块。两个组合根使用完全相同的绑定。

我无法弄清楚如何为类库中的模块配置范围。例如,给定这些绑定:

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()

这种做法是否正确?如果是,配置此行为的正确方法是什么?

1 个答案:

答案 0 :(得分:1)

In Ninject, not specifying the scope means InTransientScope()

您的选择是复制绑定或为绑定创建自定义InScope()范围规则。

最干净的解决方案(特别是假设MVC已经在使用中)是为您创建一个插入InRequestScope()机制的插件。

有一个CreateScope()方法,目前在ninject.extensions.namedscope自述文件中有最少的文档,使用like this。它要求您在NuGet中选择“Include Prerelease”。 (而且我应该写一篇关于它的wiki文章,但我的其他东西还有很多......)