使用Autofac嵌套作用域可能需要解决这个问题,但我无法自己制作足够的文档来解决这个问题。
我认为我所寻找的就像是每个HTTP请求的单例,但请求的位置是由另一个对象的生命周期来完成的。
有一个类Name
,每次将新数据加载到应用程序中时,都会创建一个新实例(从容器中解析,可能通过工厂类解析)(旧数据和{{1}实例被丢弃了。)
然后有SubSystem
个班,实施SubSystem
和SomeFeature
,实施IFeature
。
SomeService
依赖于ISomeService
和SubSystem
,而IFeature
依赖IService
。所以对象图看起来像这样:
SomeFeature
IService
仅在一个地方需要,因此暂时注册就可以了。另一方面,SubSystem
└> SomeService : IService <─┐
└> SomeFeature : IFeature ├─── same instance
└> SomeService : IService <─┘
必须解析为此子图中所有依赖项的同一实例,但是当加载新数据并创建新的IFeature
实例时,其子图必须获得自己的新“每请求单例”IService
实例。
丢弃实例的原因是,出于性能原因,它们会从加载的数据中缓存信息,这在加载新数据时将不再有效。我目前正在使用通过SubSystem
构造函数中引发的事件重置本地状态的真实单例实例,但这显然不是最佳解决方案。
正如我所说,我希望这可以像IService
一样工作,但是作为“SubSystem
实例”。
有没有办法使用Autofac API实现这一目标?
答案 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上打包成一个更好的界面,但在实践中并不常见。)