Вызвать метод из разных классов, который был реализован из интерфейса - PullRequest
0 голосов
/ 15 июня 2019

У меня есть интерфейс, который наследуется двумя классами и реализует его метод Validate (здесь нет проблем).

public interface IValidator
{
   IEnumerable<ValidationError> Validate(MyModel model);
}

public class ValidatorA : IValidator
{
   public IEnumerable<ValidationError> Validate(MyModel model)
   {
       var list = new List<ValidationError>();

       //code to add items to list

       return list;
   }
}

public class ValidatorB : IValidator
{
   public IEnumerable<ValidationError> Validate(MyModel model)
   {
       var list = new List<ValidationError>();

       //code to add items to list

       return list;
   }
}

Чего я хочу добиться - это вызвать метод из интерфейса и вызвать все методы из класса (ValidatorA, ValidatorB), который наследует интерфейс. Ниже описано, как я это делаю, но это не касается дочерних классов. Что я делаю не так или как правильно это сделать?

//assuming this is inside a method of another class
//and injected inside
var validationErrors = _myInterfaceValidator.SelectMany(x => x.Validate(myModel));  //why is this not hitting validate from the child classes
return validationErrors.ToList();

Хорошо, возможно, некоторые люди в разделах комментариев правы, что проблема не может быть здесь. Я предполагаю, что это из SimpleInjector, потому что я зарегистрировал интерфейс, как показано ниже:

container.RegisterCollection(typeof(IValidator));

Может ли это быть проблемой?

1 Ответ

0 голосов
/ 17 июня 2019

Хорошо, ребята, вы правы, проблема в том, как я регистрирую службу на моем простом инжекторе.

Вот как это должно быть:

var myValidators = new List<Type>(){ typeof(ValidatorA), typeof(ValidatorB) };
container.RegisterCollection(typeof(IValidator), myValidators);

Только для краткого объяснения.

Причиной отсутствия ошибки является то, что приложение распознает мой IValidator, когда я его зарегистрировал. И причина, по которой он не вызывает методы Validate из классов, реализующих интерфейс, заключается в том, что эти классы не были зарегистрированы как дочерние классы в SimpleInjector. Следовательно, не будет отображаться никакой ошибки, поскольку для регистрации в SimpleInjector требуются только родительские классы (в этом контексте интерфейс).

...