有限的单身寿命由另一个对象决定

时间:2015-09-15 16:40:11

标签: c# dependency-injection autofac

使用Autofac嵌套作用域可能需要解决这个问题,但我无法自己制作足够的文档来解决这个问题。

我认为我所寻找的就像是每个HTTP请求的单例,但请求的位置是由另一个对象的生命周期来完成的。

有一个类Name,每次将新数据加载到应用程序中时,都会创建一个新实例(从容器中解析,可能通过工厂类解析)(旧数据和{{1}实例被丢弃了。)

然后有SubSystem个班,实施SubSystemSomeFeature,实施IFeature

SomeService依赖于ISomeServiceSubSystem,而IFeature依赖IService。所以对象图看起来像这样:

SomeFeature

IService仅在一个地方需要,因此暂时注册就可以了。另一方面,SubSystem └> SomeService : IService <─┐ └> SomeFeature : IFeature ├─── same instance └> SomeService : IService <─┘ 必须解析为子图中所有依赖项的同一实例,但是当加载新数据并创建新的IFeature实例时,其子图必须获得自己的新“每请求单例”IService实例。

丢弃实例的原因是,出于性能原因,它们会从加载的数据中缓存信息,这在加载新数据时将不再有效。我目前正在使用通过SubSystem构造函数中引发的事件重置本地状态的真实单例实例,但这显然不是最佳解决方案。

正如我所说,我希望这可以像IService一样工作,但是作为“SubSystem实例”。

有没有办法使用Autofac API实现这一目标?

1 个答案:

答案 0 :(得分:3)

我认为您正在寻找的选项是:

.InstancePerOwned<SubSystem>()

如果你只在一个地方消费SubSystem,那么只需依靠Owned<SubSystem>并确保Dispose() {{1}在消费组件的Owned<T>方法中。

对于更透明的内容,假设您可以创建Dispose()ISubSystem一起使用,则可以执行以下操作:

SubSystem

builder.RegisterType<SubSystem>() .InstancePerOwned<SubSystem>(); builder.RegisterType<SubSystemGraph>() .As<ISubSystem>() // Appropriate sharing here... ; 的位置:

SubSystemGraph

(这可以在Autofac上打包成一个更好的界面,但在实践中并不常见。)