在 Autofac 中共享依赖实例的正确方法是什么?
What is the correct way to share dependency instances in Autofac?
我有三个 类,比方说,A
、B
和 C
,因此:
A
取决于 B
和 C
; 的实例
B
依赖于 C
; 的实例
A
和B
都需要共享C
的实例。
我如何配置容器以通过一次调用 Resolve<A>()
正确连接这些东西?
这就是生命周期作用域的用途。如果你将某个东西注册为单个实例,它就存在于根生命周期范围内,并且所有东西都共享它。如果您在每个生命周期范围内注册为实例,则在同一范围内解析的所有内容都将共享同一实例。 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. 在具有自定义要求的自定义应用程序中,显然不能 "prescriptive guidance." 有些人将工作单元包装在生命周期范围内。有些人将其留给集成包,只使用提供的 request-level 生命周期范围。
- 如果您创建了生命周期作用域,则由您来清理它。 Autofac 不会为您做这些。
- 如果集成包创建范围(例如,网络应用程序集成创建 per-request 范围),该包将清理它。如果这样做,您可能 运行 因过早处理范围而陷入麻烦。
我有三个 类,比方说,A
、B
和 C
,因此:
A
取决于B
和C
; 的实例
B
依赖于C
; 的实例
A
和B
都需要共享C
的实例。
我如何配置容器以通过一次调用 Resolve<A>()
正确连接这些东西?
这就是生命周期作用域的用途。如果你将某个东西注册为单个实例,它就存在于根生命周期范围内,并且所有东西都共享它。如果您在每个生命周期范围内注册为实例,则在同一范围内解析的所有内容都将共享同一实例。 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. 在具有自定义要求的自定义应用程序中,显然不能 "prescriptive guidance." 有些人将工作单元包装在生命周期范围内。有些人将其留给集成包,只使用提供的 request-level 生命周期范围。
- 如果您创建了生命周期作用域,则由您来清理它。 Autofac 不会为您做这些。
- 如果集成包创建范围(例如,网络应用程序集成创建 per-request 范围),该包将清理它。如果这样做,您可能 运行 因过早处理范围而陷入麻烦。