AMo*_*nin 3 c# decorator autofac
在 v6 之前,如果我想根据另一个服务的可用性来注册一个装饰器(而不是依赖于应用的其他装饰器),我可以这样做:
builder.RegisterType<ApiClientMetricsDecorator>()
.As(new DecoratorService(typeof(IApiClient)))
.OnlyIf(b => b.IsRegistered(new TypedService(typeof(IApiCallMetricsReceiver))));
Run Code Online (Sandbox Code Playgroud)
这不再起作用了。装饰器没有被应用。原因似乎是现在内部使用新的 v6 中间件机制来装饰器。
现有的.RegisterDecorator重载只允许传入 a Func<IDecoratorContext, bool>,但IDecoratorContext不允许我检查服务是否已注册,它仅用于检查装饰器链和目标实例。
不幸的是,我不能通过复制源RegisterDecorator并根据需要进行调整来创建另一个本地扩展方法,因为事实证明该类型DecoratorMiddleware是内部的。
那么用 v6 来实现我所需要的方法是什么呢?目前我能想到的唯一方法是始终注册装饰器并进行另一次注册:
builder.RegisterType<NullApiCallMetricsReceiver>()
.As<IApiCallMetricsReceiver>()
.IfNotRegistered(typeof(IApiCallMetricsReceiver));
Run Code Online (Sandbox Code Playgroud)
但这将是一个非常丑陋的解决方法,因为我完全不必要地添加一个不执行任何操作的装饰器。
如果相关,我需要这个的原因是因为装饰器的上述注册驻留在由不同项目使用的程序集中的模块中,并且仅在其中一些项目中,指标是相关的,因此它们注册了提供的类型IApiCallMetricsReceiver。
我在代码库中多次得到相同的模式。
任何帮助将不胜感激,这目前使我无法升级到 Autofac v6,而且我讨厌不更新像 Autofac 这样的核心库。
这是一个非常好的问题。不幸的是,我认为我不会得到满意的答案:
在 Autofac v6 中...你无法真正做你想做的事。现在。出于您提到的原因 - 现在不仅仅是服务,还涉及管理解析管道。
但!我已代表您提交了一个问题,以获得OnlyIf对装饰器的支持。我们最近刚刚实施了一些内部更改,以实现这一点,所以这是一个非常好的时机。
我没有关于何时交付的截止日期/预计到达时间,但它已经在雷达上。如果您愿意,可以订阅该期以继续关注。