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>();

Есть идеи?

РЕДАКТИРОВАТЬ

Я зарегистрировал ValidatorAи ValidatorBс Named, теперь проблема, как Castle Windsor может правильно внедрить эти валидаторы в ClassAи ClassB, есть ли способ сделать это? или есть лучшее решение?

если кто-то думает, что мой дизайн класса неправильный, пожалуйста, я открыт для любых советов. Пока я считаю это правильным. Да, валидатор имеет определенную конфигурацию для определенного класса. но есть причины, по которым он абстрагирован:

  1. Валидатор - это сложный объект, который иногда должен подключаться к базе данных, поэтому я ДОЛЖЕН передать интерфейс вместо реализации конструктору по причине модульного тестирования.
  2. Невозможно использовать другой интерфейс для любого из валидаторов, потому что единственный метод, который я использовал, этоValidate
  3. Я думаю, что MyBaseClass.Validate()общий метод шаблона , не так ли?
11
задан ktutnik 4 July 2012 в 11:06
поделиться