Я заметил, что многие разработчики определяют интерфейс для класса КАЖДЫЙ, который будет внедрен с использованием рамки DI. В чем преимущества определения интерфейсов для каждого класса?Зависимость впрыска и использование интерфейсов?
ответ
Позволить ваши компонент приложения (классы, которые содержат логику приложения) реализовать интерфейс имеет важное значение, так как это способствовало понятию:
программы на интерфейс, а не реализация.
Это фактически Dependency Inversion Principle. Это позволяет вам заменять, перехватывать или украшать зависимости без необходимости изменять потребителей такой зависимости.
Во многих случаях разработчики будут нарушать принципы SOLID, но при сопоставлении между классами и интерфейсами почти однозначно. Один из принципов, который почти наверняка нарушен, - это Open/closed principle, потому что, когда у каждого класса есть свой собственный интерфейс, невозможно расширить (украсить) набор классов с помощью сквозных задач (без трюков генерации динамических прокси-серверов).
В системах, которые я пишу, я определяю два общих интерфейса, которые покрывают основную часть кода бизнес-уровня. Они называются 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);
}
Кроме приятный побочный эффект, не имея, чтобы определить множество интерфейсов, что позволяет большую гибкость и легкость тестирования. Вы можете узнать больше об этом here и here.
В зависимости от системы я пишу, я мог бы также использовать интерфейсы, такие как:
IValidator<T>
для проверки сообщенияISecurityValidator<T>
для применения ограничений безопасности в сообщенияхIRepository<T>
, хранилище шаблонIAuthorizationFilter<T>
для применения авторизации/фильтрации безопасности наIQueryable<T>
запросах.
В зависимости от системы я пишу, где-то между 80% и 98% выполнения всех компонентов реализуется один из этих общих интерфейсов, которые я определяю. Это делает применение сквозных проблем для так называемых joinpoints тривиальными.
Эта запись блога есть много ответов, которые вы ищете: http://benpryor.com/blog/2006/08/23/java-advantages-of-interfaces/
Если вы не дизайн интерфейсов, вы собираетесь быть зажат в тиски, когда приходит время, чтобы реорганизовать свой код и/или добавьте улучшения. Использование инфраструктуры DI не является проблемой, когда речь заходит о разработке интерфейса. Что DI дает вам, является поздним связыванием и гораздо лучшей способностью писать модульные тесты.
он говорит, страница не найдена.! пожалуйста обновите –
- 1. Зависимость впрыска и использование конструктора по умолчанию
- 2. Жадная конструкция и зависимость впрыска
- 3. Весна Зависимость безопасности впрыска
- 4. Зависимость впрыска и многие реализации интерфейса
- 5. Зависимость впрыска и названные регистраторы
- 6. Зависимость впрыска и инициализация объекта
- 7. Зависимость Метод впрыска и инициализации
- 8. Весна Зависимость впрыска и Autowiring
- 9. Зависимость впрыска и несколько экземпляров
- 10. Web API ASP.NET Зависимость впрыска
- 11. Зависимость впрыска через Inteface и структуру проекта
- 12. Кинжал 2, Зависимость впрыска
- 13. Зависимость впрыска php-сайта
- 14. Зависимость впрыска весной
- 15. Зависимость впрыска с Akka
- 16. Зависимость впрыска в Laravel
- 17. Зависимость впрыска в Django
- 18. Зависимость впрыска - контроллер завод
- 19. Зависимость впрыска php
- 20. Зависимость впрыска - именованные зависимости
- 21. Зависимость впрыска в Guice
- 22. Просмотреть зависимость впрыска
- 23. Зависимость впрыска для какао?
- 24. Зависимость впрыска в конструкторе
- 25. Зависимость впрыска Угловая 2
- 26. Зависимость впрыска без рамки
- 27. Зависимость впрыска перед генерацией
- 28. WPF Зависимость впрыска
- 29. Зависимость впрыска ActionFilterAttribute альтернатива
- 30. Зависимость впрыска в петле
Зачем закрывать? Как насчет времени и оставить комментарий? – aryaxt
-1 См. Часто задаваемые вопросы «Какие вопросы я могу задать здесь?» и «Какие вопросы мне не следует задавать здесь». Это первые два в списке. –
Ваш вопрос действительный и интересный вопрос, но он немного расплывчатый и не очень конкретный (например, примеры кода), поэтому люди отказались от него и проголосовали за его закрытие. – Steven