может быть, это просто, но поиск его в Интернете уже дают мне головную больВиндзорский замок - Как отобразить именованный экземпляр в инъекции конструктора
здесь есть проблема:
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>();
Любая идея?
EDIT
Я зарегистрировал ValidatorA
и ValidatorB
с Named
, теперь проблемой, как Виндзорский замок может впрыснуть этот валидатор правильно к ClassA
и ClassB
, есть ли способ сделать это? или есть ли лучшее решение?
если есть кто-то думаю, что мой класс дизайн неправильный, пожалуйста, я открываю для любого совета. Пока я думаю, что это правильно. Да, валидатор имеет определенную конфигурацию для определенного класса. но есть причины, по которым они абстрагированы:
- Validator - это сложный объект, который когда-то должен подключаться к базе данных, поэтому я должен передать интерфейс вместо реализации конструктору для обоснования модульного тестирования.
- Ни в коем случае использовать другой интерфейс для любого из валидатора, потому что единственный метод, который я использовал это
Validate
- Я думаю
MyBaseClass.Validate()
общий шаблон метод шаблон не так ли?
Ваше описание проблемы - абстрактно. –
Если ClassA требует конкретной реализации IValidator, тогда дизайн ошибочен, так как интерфейс не дает никакой полезной абстракции. –
@Jacek Grogon, нет, мне нужен только метод 'Validate', на самом деле есть базовый класс ClassA и ClassB, который вызывает метод' Validate'. но я не пишу его здесь, чтобы скрыть сложность. – ktutnik