[英]Castle Windsor - How to map Named instance in constructor injection
也许这很容易,但在互联网上搜索已经让我头疼
这是问题所在:
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<OtherClass>();
任何的想法?
编辑
我使用Named
注册了ValidatorA
和ValidatorB
,现在问题是Castle Windsor如何将这些验证器正确地注入ClassA
和ClassB
,有没有办法做到这一点? 或者有更好的解决方案吗?
如果有人认为我的班级设计错了请,我打开任何建议。 到目前为止,我认为是正确的。 是的,验证器具有特定类的特定配置。 但它有抽象的原因:
Validate
MyBaseClass.Validate()
是一个常见的模板方法模式不是吗? 无需深入了解所选架构的细节,只关注Windsor容器配置:
如果您已经注册多个命名实现给定的接口( IValidator
),你可以指定你想要注册的消费类(当使用哪一个ClassA
, ClassB
使用) ServiceOverrides
:
以下容器配置提供带有ClassA
实例的OtherClass
,其中ValidatorA
和ClassB
实例具有ValidatorB
:
var container = new WindsorContainer();
container.Register(Component.For<IClassA>().ImplementedBy<ClassA>()
.DependsOn(ServiceOverride.ForKey<IValidator>().Eq("ValidatorA")));
container.Register(Component.For<IClassB>().ImplementedBy<ClassB>()
.DependsOn(ServiceOverride.ForKey<IValidator>().Eq("ValidatorB")));
container.Register(Component.For<IValidator>().ImplementedBy<ValidatorA>()
.Named("ValidatorA"));
container.Register(Component.For<IValidator>().ImplementedBy<ValidatorB>()
.Named("ValidatorB"));
container.Register(Component.For<OtherClass>().ImplementedBy<OtherClass>());
var oc = container.Resolve<OtherClass>();
看来,你试图把紧耦合( ClassA
与ValidatorA
, ClassB
与ValidatorB
)作为独立的类型转换成一个共同的容器中。 这毫无意义。 如果你必须依赖这样的紧耦合,那么在这方面忘记依赖注入,只是硬引用类型。
如果您可以为所有类实现公共验证器,那么这将更有意义。 例如,让类负责提供验证规则,让Validator
只执行规则。 或者也许只是在您的课程中包含整个验证,这可能是这里最明智的方案。
MyBaseClass.Validate()
看起来像控件的反转,但不像模板方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.