我想以这样一种方式装饰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>();
如果ServiceWithCaching
和ServiceWithLogging
都在其构造函数中获取IService
,则包装IService的实例,在内部调用它并执行其他操作(例如缓存,日志记录)。
Consumer1
和Consumer2
都在其构造函数中接受IService
。
我希望Consumer1
注入ServiceWithLogging
实例和ServiceWithCaching
的Consumer2
。所需的 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);