C#学习教程:Castle Windsor – 如何映射构造函数注入中的命名实例分享


Castle Windsor – 如何映射构造函数注入中的命名实例

也许这很容易,但在互联网上搜索已经让我头疼

这是问题所在:

interface IValidator { void Validate(object obj); } public class ValidatorA : IValidator { public void Validate(object obj) { } } public class ValidatorB : IValidator { public void Validate(object obj) { } } interface IClassA { } interface IClassB { } public class MyBaseClass { protected IValidator validator; public void Validate() { validator.Validate(this); } } public class ClassA : MyBaseClass, IClassA { //problem: validator should ValidatorA public ClassA(IValidator validator) { } } public class ClassB : MyBaseClass, IClassB { //problem: validator should ValidatorB public ClassB(IValidator validator) { } } public class OtherClass { public OtherClass(IClassA a, IClassB b) { } } //on Main var oc = container.Resolve(); 

任何的想法?

编辑

我使用Named注册了ValidatorAValidatorB ,现在问题是Castle Windsor如何将这些validation器正确地注入ClassAClassB ,有没有办法做到这一点? 或者有更好的解决方案吗?

如果有人认为我的class级设计错了请,我会打开任何建议。 到目前为止,我认为是正确的。 是的,validation器具有特定类的特定配置。 但它有抽象的原因:

  1. Validator是一个复杂的对象,有时候应该连接到数据库,所以为了unit testing的原因,我必须将接口而不是实现传递给构造函数。
  2. 无法为任何Validator使用不同的接口,因为我使用的唯一方法是Validate
  3. 我觉得MyBaseClass.Validate()是一个常见的模板方法模式不是吗?

在没有深入了解所选架构的细节的情况下,只关注Windsor容器配置:

如果已将多个命名实现注册到给定接口( IValidator ),则可以使用IValidator指定在使用消费者类( ClassAClassB )注册时要使用的实现:

以下容器配置提供带有ClassA实例的OtherClass ,其中ValidatorAClassB实例带有ValidatorB

 var container = new WindsorContainer(); container.Register(Component.For().ImplementedBy() .DependsOn(ServiceOverride.ForKey().Eq("ValidatorA"))); container.Register(Component.For().ImplementedBy() .DependsOn(ServiceOverride.ForKey().Eq("ValidatorB"))); container.Register(Component.For().ImplementedBy() .Named("ValidatorA")); container.Register(Component.For().ImplementedBy() .Named("ValidatorB")); container.Register(Component.For().ImplementedBy()); var oc = container.Resolve(); 

您似乎试图将紧密的夫妻(带有ValidatorA ClassA带有ValidatorA ClassB )作为独立类型放入一个公共容器中。 这毫无意义。 如果你必须依赖这样的紧耦合,那么在这方面忘记dependency injection,只是硬引用类型。

如果您可以为所有类实现公共validation器,那么这将更有意义。 例如,让类负责提供validation规则,让Validator只执行规则。 或者也许只是在您的课程中包含整个validation,这可能是最明智的方案。

MyBaseClass.Validate()看起来像控件的反转,但不像模板方法。

上述就是C#学习教程:Castle Windsor – 如何映射构造函数注入中的命名实例分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—猴子技术宅(www.ssfiction.com)

本文来自网络收集,不代表猴子技术宅立场,如涉及侵权请点击右边联系管理员删除。

如若转载,请注明出处:https://www.ssfiction.com/ckf/960131.html

发表评论

邮箱地址不会被公开。 必填项已用*标注