gpt4 book ai didi

c# - Autofac Singleton Decorator 构造多次

转载 作者:太空宇宙 更新时间:2023-11-03 14:58:52 25 4
gpt4 key购买 nike

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

 builder.RegisterDecorator<IBackendOperatorServiceProxy>(
(c, inner) => new CachedBackendOperatorServiceProxy(inner),
fromKey: "BackendOperatorService")
.SingleInstance();

我会将具体实现注册为

 builder.RegisterType<BackendOperatorServiceProxy>().Named<IBackendOperatorServiceProxy>("BackendOperatorService");

我遇到的问题是,当在 webApi Controller 中解决时,这个单例装饰器总是被重新创建(每个请求一次)。

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

我真的无法理解出现此类问题的可能原因。我在不同的项目中使用过 SIngleInstance() 不同的时间,它总是可以正常工作。为了进一步“调查”这一点,我还创建了一个注册为单例的假类,并将其注入(inject)与装饰器相同的 Controller 中。它按预期工作,只创建了一个假类的实例。为了完整起见,我将这个假的注册为:

builder.Register<Foo>(c => new Foo(c.ResolveNamed<IBackendOperatorServiceProxy>("BackendOperatorService"))).AsImplementedInterfaces().SingleInstance();

这是缓存(装饰器)服务的构造函数:

public CachedBackendOperatorServiceProxy(IBackendOperatorServiceProxy decoratedServiceImplementation)
{
_decoratedServiceImplementation = decoratedServiceImplementation ?? throw new ArgumentNullException(nameof(decoratedServiceImplementation));
_cachedElements = new Dictionary<string, CachedOperatorDto>();
}

装饰器和 SIngleInstances 有什么问题或我遗漏了什么吗?

最佳答案

感谢 Evk,最简单的解决方案是坚持“手动”装饰器注册,因为当您需要装饰多个实现时,应该使用 RegisterDecorator(如评论中提供的链接中所述),而不是像我那样使用一个试图做。

关于c# - Autofac Singleton Decorator 构造多次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47306874/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com