在Autofac中共享依赖项实例的正确方法是什么?

时间:2019-05-16 15:41:13

标签: dependency-injection autofac autofac-configuration

我有三个类,例如ABC,所以:

  • A取决于BC的实例;
  • B取决于C的实例;
  • AB都需要共享C的实例。

如何配置容器以通过一次调用Resolve<A>()正确地连接东西?

1 个答案:

答案 0 :(得分:3)

这就是生命周期作用域。如果您将某项注册为单个实例,则它会存在于根生存期范围中,并且所有内容都共享它。如果您为每个生存期范围注册为实例,则在同一范围内解析的所有内容都将共享同一实例。 Tons and tons of doc on this topic including examples.

它当然可以变得更复杂。您可以在手动创建的共享实例中注册lambda。您可以使用Owned<T>为单个组件创建一个很小的生存期范围...同样,大量文档。我建议您自己做一些实验,以获得良好的工作知识。

如何管理范围取决于您。 You may get some ideas from this doc on handling per-request lifetime scopes.在具有自定义要求的自定义应用中,显然没有“说明性指导”。有些人将工作单元包装在生命周期范围内。有些人将其留给集成软件包,仅使用提供的请求级生存期范围。

  • 如果创建生命周期作用域,则由您自行清理。 Autofac不会为您做到这一点。
  • 如果集成包创建了范围(例如,Web应用集成创建了每个请求的范围),则该包将对其进行清理。如果这样做,则过早处置示波器可能会遇到麻烦。