我正在尝试为一些服务创建一个简单的内存缓存机制。我使用装饰者模式,创建了一个缓存版本的服务来装饰它的具体实现。 通过使用Autofac,我将注册缓存装饰器为SingleInstance()以确保数据留在内存中。
builder.RegisterDecorator<IBackendOperatorServiceProxy>(
(c, inner) => new CachedBackendOperatorServiceProxy(inner),
fromKey: "BackendOperatorService")
.SingleInstance();
我会将具体实现注册为
builder.RegisterType<BackendOperatorServiceProxy>().Named<IBackendOperatorServiceProxy>("BackendOperatorService");
我遇到的问题是,在WebApi控制器中解析时,这个单例装饰器总是被重新创建(每个请求一次)。
我已经(希望我已经)正确地为autofac设置了owin管道(实际上,服务被注入到由控制器调用的BL类中)。
我真的无法理解这样一个问题的可能原因。我在不同的项目中多次使用SingleInstance(),而且总是没有问题。
为了进一步“调查”这个问题,我还创建了一个假类,将其注册为单例,并将其注入到与装饰器相同的控制器中。它像预期的那样工作,只创建了一个假类的实例。 为了完整起见,我已将此虚拟类注册为:
builder.Register<Foo>(c => new Foo(c.ResolveNamed<IBackendOperatorServiceProxy>("BackendOperatorService"))).AsImplementedInterfaces().SingleInstance();
以下是Cached (Decorator)服务的构造函数:
public CachedBackendOperatorServiceProxy(IBackendOperatorServiceProxy decoratedServiceImplementation)
{
_decoratedServiceImplementation = decoratedServiceImplementation ?? throw new ArgumentNullException(nameof(decoratedServiceImplementation));
_cachedElements = new Dictionary<string, CachedOperatorDto>();
}
装饰器和单例模式有什么问题或者我忽略了什么吗?