由另一个对象确定的有限单例生命周期

本文关键字:单例 生命 周期 一个对象 | 更新日期: 2023-09-27 18:13:02

这可能是Autofac嵌套作用域可以解决的问题,但我还没有能够制作足够的文档来自己解决这个问题。

我想我正在寻找的是像每个http请求的单例,但请求的位置被另一个对象的生命周期占用。

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

还有SomeFeature类,实现IFeature, SomeService类,实现ISomeService

SubSystem同时依赖于IFeatureIService,而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上打包成一个更好的界面,但在实践中并不常见)