2012-02-25 6 views
22

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

+4

Зачем закрывать? Как насчет времени и оставить комментарий? – aryaxt

+0

-1 См. Часто задаваемые вопросы «Какие вопросы я могу задать здесь?» и «Какие вопросы мне не следует задавать здесь». Это первые два в списке. –

+1

Ваш вопрос действительный и интересный вопрос, но он немного расплывчатый и не очень конкретный (например, примеры кода), поэтому люди отказались от него и проголосовали за его закрытие. – Steven

ответ

16

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

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

Это фактически 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 тривиальными.

2

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

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

+0

он говорит, страница не найдена.! пожалуйста обновите –

Смежные вопросы