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

ktu*_*nik 11 c# 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<OtherClass>();
Run Code Online (Sandbox Code Playgroud)

任何的想法?

编辑

我注册ValidatorAValidatorB使用Named,现在的问题是如何温莎城堡可以适当注入这些验证的ClassAClassB,是有办法做到这一点?或者有更好的解决方案吗?

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

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

nem*_*esv 12

无需深入了解所选架构的细节,只关注Windsor容器配置:

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

下面容器配置提供商的OtherClassClassA实例与ValidatorAClassB实例与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>();
Run Code Online (Sandbox Code Playgroud)