1

我有一个使用 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应该取决于使用的组合根。MVC 项目应该有InRequestScope()for Service2Impl(以及所有其他未指定范围的绑定)。不在 http 上下文中运行的调度程序项目应该使用InThreadScope().

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

4

1 回答 1

1

在 Ninject 中,不指定范围意味着InTransientScope().

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

最干净的解决方案(特别是考虑到 MVC 已经在发挥作用)是让您创建一个插入该InRequestScope()机制的插件。

在 ninject.extensions.namedscope README 中有一种CreateScope()方法目前文档最少,它的使用方式如下。它要求您在 NuGet 中选择“包括预发布”。(我应该写一篇关于它的维基文章,但我的盘子里还有太多其他的东西......)

于 2013-05-20T08:57:50.587 回答