1

我想,一些消費者會根據自己的類型特定的裝飾以這樣的方式來裝飾IService消費者的服務類型,像這樣:註冊裝飾有條件的基礎上簡單的噴油器

container.Register<IService, Service>(); 
container.RegisterDecorator<IService, ServiceWithCaching>(); 
container.RegisterDecoratorConditional<IService, ServiceWithLogging> 
    (ctx => ctx.Consumer.ServiceType == 
    typeof(IConsumerThatNeedsDecoratedService)); 
container.Register<IConsumerThatNeedsServiceWithLogging, Consumer1>(); 
container.Register<INormalConsumer, Consumer2>(); 

其中兩個ServiceWithCachingServiceWithLogging在其構造函數中取IService,包裝一個IService的實例,在內部調用它並執行其他操作(例如緩存,日誌記錄)。

Consumer1Consumer2在其構造函數中接受IService

我要Consumer1注入ServiceWithLoggingConsumer2ServiceWithCaching的實例。期望的行爲是Consumer1將使用緩存結果的IService的實例,而Consumer2將使用IService的實例,這兩個實例都緩存結果的日誌調用。

是否可以在簡單的噴油器,如果沒有任何已知的解決方法?

回答

2

你不能用RegisterDecorator做到這一點,但作爲文件的Applying decorators conditionally based on consumer節介紹,您可以在此使用RegisterConditional實現:

container.RegisterConditional<IService, ServiceWithLogging>(
    c => c.Consumer.ImplementationType == typeof(Consumer1)); 

container.RegisterConditional<IService, ServiceWithCaching>(
    c => c.Consumer.ImplementationType != typeof(Consumer1) 
     && c.Consumer.ImplementationType != typeof(ServiceWithCaching)); 

container.RegisterConditional<IService, Service>(c => !c.Handled); 
相關問題