由另一个对象确定的有限单例生命周期
本文关键字:单例 生命 周期 一个对象 | 更新日期: 2023-09-27 18:13:02
这可能是Autofac嵌套作用域可以解决的问题,但我还没有能够制作足够的文档来自己解决这个问题。
我想我正在寻找的是像每个http请求的单例,但请求的位置被另一个对象的生命周期占用。
有一个类SubSystem
,每次将新数据加载到应用程序中时都会创建一个新实例(从容器解析,可能通过工厂类)(旧数据和SubSystem
实例被丢弃)。
还有SomeFeature
类,实现IFeature
, SomeService
类,实现ISomeService
。
SubSystem
同时依赖于IFeature
和IService
,而SomeFeature
依赖于IService
。对象图是这样的
SubSystem
└> SomeService : IService <─┐
└> SomeFeature : IFeature ├─── same instance
└> SomeService : IService <─┘
IFeature
只在一个地方需要,所以在这里使用暂态注册是可以的。另一方面,IService
必须解析为这个子图中的所有依赖关系的相同实例,但是当加载新的数据并创建新的SubSystem
实例时,它的子图必须获得自己的新的"per-request singleton"IService
实例。
丢弃实例的原因是它们出于性能原因缓存加载数据中的信息,当加载新数据时这些信息将不再有效。我目前使用的是真正的单例实例,通过SubSystem
构造函数中引发的事件重置其本地状态,但这显然是一个不太理想的解决方案。
正如我所说的,我希望这像InstancePerHttpRequest()
一样工作,但作为"每个SubSystem
的实例"。
是否有一种方法来实现这使用Autofac API?
我想你要找的选项是:
.InstancePerOwned<SubSystem>()
如果你只在一个地方消费SubSystem
,那就在那个地方依赖Owned<SubSystem>
, 并确保在消费组件的Dispose()
方法中Dispose()
Owned<T>
。
对于一些更透明的东西,假设你可以创建ISubSystem
来配合SubSystem
,你可以这样做:
builder.RegisterType<SubSystem>()
.InstancePerOwned<SubSystem>();
builder.RegisterType<SubSystemGraph>()
.As<ISubSystem>()
// Appropriate sharing here...
;
其中SubSystemGraph
为:
class SubSystemGraph: ISubSystem, IDisposable
{
readonly Owned<SubSystem> _root;
public SubSystemGraph(Owned<SubSystem> root)
{
_root = root;
}
public void Dispose()
{
_root.Dispose();
}
// Methods of ISubSystem delegate to _root.Value
public void Foo()
{
_root.Value.Foo();
}
}
(这可以在autoface上打包成一个更好的界面,但在实践中并不常见)