Подтвердить что ты не робот

Зависимость Впрыскивание и использование интерфейсов?

Я заметил, что многие разработчики определяют интерфейс для класса КАЖДЫЙ, который будет внедрен с использованием рамки DI. В чем преимущества определения интерфейсов для каждого класса?

4b9b3361

Ответ 1

Предоставление вашим прикладным компонентам (классам, которые содержат логику приложения) реализация интерфейса важна, поскольку это способствовало понятию:

Программа для интерфейса, а не для реализации.

Это эффективно Принцип инверсии зависимостей. Это позволяет вам заменять, перехватывать или украшать зависимости без необходимости изменять потребителей такой зависимости.

Во многих случаях разработчики будут нарушать принципы SOLID, однако при наличии сопоставления между отдельными классами и интерфейсы. Один из принципов, который почти наверняка нарушен, - это принцип Open/closed, потому что, когда каждый класс имеет свой собственный интерфейс, невозможно расширять (украшать) набор классов с перекрестными проблемами (без динамической генерации прокси-генерации, которая есть).

В системах, которые я пишу, я определяю два общих интерфейса, которые покрывают основную часть кода бизнес-уровня. Они называются ICommandHandler<TCommand> и IQueryHandler<TQuery, TResult>:

public interface ICommandHandler<TCommand>
{
    void Handle(TCommand command);
}

public interface IQueryHandler<TQuery, TResult> where TQuery : IQuery<TResult>
{
    TResult Handle(TQuery query);
}

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

В зависимости от системы, которую я пишу, я мог бы также использовать такие интерфейсы, как:

  • IValidator<T> для проверки сообщений
  • ISecurityValidator<T> для применения ограничений безопасности для сообщений
  • IRepository<T>, шаблон репозитория
  • IAuthorizationFilter<T> для применения авторизации/фильтрации безопасности по запросам IQueryable<T>.

В зависимости от системы, которую я пишу, где-то между 80% и 98% выполнения всех компонентов реализуется один из этих общих интерфейсов, которые я определяю. Это делает применение сквозных проблем для так называемых точек соединения тривиальным.

Ответ 2

В этой записи в блоге много ответов, которые вы ищете: http://benpryor.com/blog/2006/08/23/java-advantages-of-interfaces/

Если вы не разрабатываете интерфейсы, вам будет сложно, когда придет время для реорганизации вашего кода и/или добавления улучшений. Использование инфраструктуры DI не является проблемой, когда речь заходит о разработке интерфейса. Что DI дает вам, является поздним связыванием и гораздо лучшей способностью писать модульные тесты.