在简单注入器中注册基于消费者服务类型的装饰器条件



我想以这样一种方式装饰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注入ServiceWithLogging实例和ServiceWithCachingConsumer2。所需的 behvavior 是Consumer1将使用缓存结果的IService实例,而Consumer2将使用两个缓存结果和日志调用的IService实例。

在简单注射器中是否有可能,如果不是任何已知的解决方法?

你不能用RegisterDecorator来做到这一点,但正如文档的有条件地基于消费者应用装饰器部分所解释的那样,您可以使用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);

最新更新