使用Unity DI创建嵌套生命周期范围

时间:2017-09-15 14:34:30

标签: c# dependency-injection unity-container

我有一个使用Unity作为GlobalConfiguration.Configuration.DependencyResolver的Web API项目。该项目使用工作单元模式和单个数据访问层,该数据访问层在每个请求的整个生命周期内保持在内存中。在每个请求事件结束时,我想使用自己独特的数据访问层执行事件,以便它们可以并行运行(共享会导致并发问题)。

如何在Http请求上下文中创建子生存期范围?

我可以访问UnityDependencyResolver的静态实例,该实例的方法为IDependencyScope BeginScope(),但是如果它实现了System.Web.Http.Dependencies.IDependencyResolver,那么它似乎使用的是不正确的选项吗?

使用其他DI框架,例如Autofac,它将是:

using(var scope = container.BeginLifetimeScope())
{
  var service = scope.Resolve<IService>();

  using(var nestedScope = scope.BeginLifetimeScope())
  {
    var anotherService = nestedScope.Resolve<IOther>();
  }
}

我更愿意将事件移动到其他进程并通过消息队列触发,但此时无法进行。

1 个答案:

答案 0 :(得分:1)

Unity容器可以create child container

using(var scope = container.CreateChildContainer())
{
  var service = scope.Resolve<IService>();

  using(var nestedScope = scope.CreateChildContainer())
  {
    var anotherService = nestedScope.Resolve<IOther>();
  }
}

将其与different lifetime managers(例如HierarchicalLifetimeManager)相结合,您可以获得结果。