簡體   English   中英

Autofac 6 - 根據其他服務的可用性注冊裝飾器

[英]Autofac 6 - register decorators conditional on the availability of another service

在 v6 之前,如果我想根據另一個服務的可用性注冊一個裝飾器——而不是依賴於應用的其他裝飾器——我可以這樣做:

builder.RegisterType<ApiClientMetricsDecorator>()
       .As(new DecoratorService(typeof(IApiClient)))
       .OnlyIf(b => b.IsRegistered(new TypedService(typeof(IApiCallMetricsReceiver))));

這不再起作用了。 沒有應用裝飾器。 原因似乎是內部現在新的 v6 中間件機制用於裝飾器。

現有的.RegisterDecorator重載只允許傳入Func<IDecoratorContext, bool> ,但IDecoratorContext不允許我檢查服務是否已注冊,它僅用於檢查裝飾器鏈和目標實例。

不幸的是,我不能通過復制RegisterDecorator的源並根據需要進行調整來創建另一個本地擴展方法,因為事實證明DecoratorMiddleware類型是內部的。

那么用v6實現我需要的方法是什么? 目前我能想到的唯一方法是始終注冊裝飾器並進行另一次注冊:

builder.RegisterType<NullApiCallMetricsReceiver>()
       .As<IApiCallMetricsReceiver>()
       .IfNotRegistered(typeof(IApiCallMetricsReceiver));

但這將是一個非常丑陋的解決方法,因為我會完全不必要地添加一個什么都不做的裝飾器。

如果它是相關的,那么我需要它的原因是因為裝飾器的上述注冊駐留在程序集中的一個模塊中,該模塊被不同的項目使用,並且僅在其中一些項目中,指標是相關的,因此它們注冊了一個提供IApiCallMetricsReceiver的類型.

我在我的代碼庫中多次得到相同的模式。

任何幫助將不勝感激,目前這使我無法升級到 Autofac v6,而且我討厭不了解 Autofac 等核心庫的最新信息。

這是一個非常好的問題。 不幸的是,我認為我不會有一個令人滿意的答案:

在 Autofac v6 中......你不能真正做你想做的事。 馬上。 由於您提到的原因 - 現在不僅僅是關於服務,而是關於管理解決方案管道。

但! 我已代表您提交了一個問題,以獲得對裝飾器的OnlyIf支持。 我們最近剛剛實施了一些內部更改,允許這種情況發生,所以現在是一個很好的時機。

我沒有關於何時交付的截止日期/預計到達時間,但它在雷達上。 如果您願意,可以訂閱該問題以跟進。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM