C# 多次构造的Autofac单例装饰器

C# 多次构造的Autofac单例装饰器,c#,owin,autofac,decorator,C#,Owin,Autofac,Decorator,我正在尝试为一些服务创建一个简单的内存缓存机制。我正在使用Decorator模式,创建服务的缓存版本,用于装饰它的具体实现。 通过使用Autofac,我将缓存装饰器注册为SingleInstance(),以确保数据保留在内存中 builder.RegisterDecorator<IBackendOperatorServiceProxy>( (c, inner) => new CachedBackendOperatorServiceProxy(inner),

我正在尝试为一些服务创建一个简单的内存缓存机制。我正在使用Decorator模式,创建服务的缓存版本,用于装饰它的具体实现。 通过使用Autofac,我将缓存装饰器注册为SingleInstance(),以确保数据保留在内存中

 builder.RegisterDecorator<IBackendOperatorServiceProxy>(
      (c, inner) =>  new CachedBackendOperatorServiceProxy(inner), 
      fromKey: "BackendOperatorService")
      .SingleInstance();
builder.RegisterDecorator(
(c,内部)=>新的CachedBackendOperatorServiceProxy(内部),
fromKey:“后台操作员服务”)
.SingleInstance();
我将把具体实施登记为:

 builder.RegisterType<BackendOperatorServiceProxy>().Named<IBackendOperatorServiceProxy>("BackendOperatorService");
builder.RegisterType().Named(“BackInteroperatorService”);
我遇到的问题是,当在webApi控制器中解决时,这个单例装饰器总是被重新创建(每个请求一次)

我已经(希望)为autofac正确地设置了owin管道(事实上,该服务被注入到控制器调用的BL类中)

我真的不明白这样一个问题的可能原因。我在不同的项目中使用过SIngleInstance(),它总是毫无问题地工作。 为了进一步“调查”这一点,我还创建了一个注册为singleton的假类,并将其注入到与装饰器相同的控制器中。它按预期工作,只创建假类的一个实例。 为完整起见,我已将此假文件注册为:

builder.Register<Foo>(c => new Foo(c.ResolveNamed<IBackendOperatorServiceProxy>("BackendOperatorService"))).AsImplementedInterfaces().SingleInstance();
builder.Register(c=>newfoo(c.ResolveNamed(“BackendOperatorService”)).AsImplementedInterfaces().SingleInstance();
这是缓存(装饰器)服务的构造函数:

public CachedBackendOperatorServiceProxy(IBackendOperatorServiceProxy装饰服务实现)
{
_decoratedServiceImplementation=decoratedServiceImplementation??抛出新的ArgumentNullException(nameof(decoratedServiceImplementation));
_cachedElements=新字典();
}

装饰器和单实例是否有任何问题或我缺少的东西

多亏了Evk,最简单的解决方案就是坚持“手动”装饰器注册为RegisterDecorator(如注释中提供的链接中所述),当您需要装饰多个实现时,应该使用它,而不是像我尝试的那样装饰一个实现

如果您手动注册decorator,而不使用RegisterDecorator,这会像预期的那样工作吗?是的。通过手动注册decorator似乎可以按预期工作。因此,autofac似乎存在某种问题。无论如何,这就是我注册服务的方式:builder.Register(c=>newcachedbackendoperatorservicecproxy(c.ResolveNamed(“BackendOperatorService”))).AsImplementedInterfaces().SingleInstance();顺便问一下,您知道我在前面的评论中所做的注册和使用RegisterDecorator之间有什么区别吗?本文阐述了这些区别。也许这就是它不能作为单例运行的原因(因为它将包装使用相同密钥注册的所有实例,而不仅仅是一个实例)。我曾多次尝试使用decorators\adapters,但每次都出现了一些问题(我记得我在这里回答了几个与这些问题相关的问题),所以我也只是使用了很好的旧手动注册。
public CachedBackendOperatorServiceProxy(IBackendOperatorServiceProxy decoratedServiceImplementation)
{
  _decoratedServiceImplementation = decoratedServiceImplementation ?? throw new ArgumentNullException(nameof(decoratedServiceImplementation));
  _cachedElements = new Dictionary<string, CachedOperatorDto>();
}