C# SimpleInjector RegisterDecorator方法的对象等价物

C# SimpleInjector RegisterDecorator方法的对象等价物,c#,ninject,simple-injector,C#,Ninject,Simple Injector,我在简单容器中有以下代码: container.RegisterDecorator(typeof(ICommandHandler<>), typeof(ValidationCommandHandlerDecorator<>)); Simple Injector中的这个方法只需要2个步骤,所以您能告诉我这里缺少了什么吗?我认为没有直接等效于SimpleInjector的RegisterDecorator功能。如果我理解正确的话,这定义了每当您请求ICommandH

我在简单容器中有以下代码:

container.RegisterDecorator(typeof(ICommandHandler<>),
    typeof(ValidationCommandHandlerDecorator<>));

Simple Injector中的这个方法只需要2个步骤,所以您能告诉我这里缺少了什么吗?

我认为没有直接等效于SimpleInjector的RegisterDecorator功能。如果我理解正确的话,这定义了每当您请求ICommandHandler时,都会返回一个ValidationCommandHandlerDecorator,它装饰一些默认的ICommandHandler。 在Ninject中,你需要像以前那样做。至少我不知道有任何直接提供这种机制的功能或扩展

另见这个问题

在阅读了Simple Injector中的装饰器之后,我真的看不出它与普通的注入有什么不同。你为什么不能这么做

kernel.Bind(typeof(ICommandHandler<>))()
      .To(typeof(ValidationCommandHandlerDecorator<>))
kernel.Bind(typeof(ICommandHandler))()
.To(类型(ValidationCommandHandlerDecorator))

如果需要根据对象的类型控制注入几种类型,则可以使用
.whenInjectedTo()

使用简单注入器应用装饰器与大多数其他容器之间的区别,简单注入器中的装饰器本身并没有注册,而是成为现有注册的一部分(它们更改/拦截实际注册)。在大多数情况下,这种差异无关紧要,但确实使某些场景变得相当容易。SimpleInjector的用户经常有条件地应用修饰符(基于一些泛型类型约束或谓词)。对于其他框架来说,这通常要困难得多。这通常不是不可能的,但也不是很干净。@Steven-Ninject还提供了拦截功能,您可以使用类型或谓词来控制注入内容(使用
.When()
作为谓词)。我仍然无法理解这里的区别,“没有注册自己,但成为现有注册的一部分”这句话似乎毫无意义。如果你想注册一个不同的东西,为什么要注册一个呢?只需更改注册,这就是将注册设置为配置的关键所在。Ninject的拦截功能在功能上与Simple Injector的装饰功能非常相似,但拦截!=装饰不同之处在于装饰器比拦截器更干净,例如,因为它们可以以框架无关的方式编写,而拦截器必须实现某种(特定于框架的)接口。对您来说,差异似乎无关紧要,但并非所有开发人员都这么认为。这就是为什么Simple Injector专注于装饰而不是拦截。
kernel.Bind(typeof(ICommandHandler<>))()
      .To(typeof(ValidationCommandHandlerDecorator<>))