2012-02-25 15 views
22

Zauważyłem, że wielu programistów definiuje interfejs dla klasy KAŻDEGO, który zostanie wtryśnięty przy użyciu frameworka DI. Jakie są zalety definiowania interfejsów dla każdej klasy?Dependency Injection & using interfaces?

+4

Dlaczego blisko? A może poświęcisz czas i zostawisz komentarz? – aryaxt

+0

-1 Zobacz najczęściej zadawane pytania. "Jakiego rodzaju pytań mogę tu zadać?" i "Jakie pytania nie powinienem tu zadawać". Są to pierwsze dwa na liście. –

+1

Twoje pytanie jest poprawne i interesujące, ale jest trochę niejasne i mało szczegółowe (na przykład nie ma przykładów kodu), dlatego ludzie go zignorowali i głosowali, że zostanie on zamknięty. – Steven

Odpowiedz

16

pozwoleniem komponenty aplikacji (klas, które zawierają logikę aplikacji) implementować interfejs jest bardzo ważne, ponieważ promował koncepcję:

programu do interfejsu, a nie implementacji.

To skutecznie Dependency Inversion Principle. Dzięki temu można zastąpić, przechwycić lub udekorować zależności bez potrzeby zmiany konsumentów takiej zależności.

W wielu przypadkach programiści będą łamać zasady SOLID, jednak w przypadku mapowania typu "jeden do jednego" między klasami i interfejsami. Jedną z zasad, która jest prawie na pewno naruszona, jest Open/closed principle, ponieważ gdy każda klasa ma swój własny interfejs, nie jest możliwe rozszerzenie (dekorowanie) zestawu klas o zagadnienia przekrojowe (bez sztuczki generowania dynamicznego proxy).

W systemach, które piszę, definiuję dwa ogólne interfejsy, które obejmują większość kodu warstwy biznesowej. Nazywane są ICommandHandler<TCommand> i IQueryHandler<TQuery, TResult>:

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

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

Poza ładnym bocznej efekt nie trzeba definiować wiele interfejsów, pozwala to na dużą elastyczność i łatwość testowania. Możesz przeczytać więcej na ten temat here i here.

zależności od systemu piszę, mogę również użyć interfejsów, takich jak:

  • IValidator<T> walidacji komunikatów
  • ISecurityValidator<T> stosowania ograniczeń zabezpieczeń wiadomości
  • IRepository<T>, repozytorium wzór
  • IAuthorizationFilter<T> dotyczące stosowania filtrowania autoryzacji/zabezpieczeń na zapytaniach IQueryable<T>.

W zależności od systemu, piszę, gdzieś pomiędzy 80% a 98% procent wszystkich komponentów implementuję jeden z tych ogólnych interfejsów, które definiuję. Sprawia to, że stosowanie zagadnień przekrojowych do tak zwanych "błahych" to tak zwana joinpoints.

2

Ten wpis blog ma wiele odpowiedzi szukasz: http://benpryor.com/blog/2006/08/23/java-advantages-of-interfaces/

Jeśli nie projektowania interfejsów, masz zamiar zostać sparaliżowane, gdy przychodzi czas byłaby kodu i/lub dodaj ulepszenia. Używanie frameworka DI nie wchodzi w grę, jeśli chodzi o projektowanie interfejsu. To, co daje ci DI, to późna oprawa i znacznie lepsza umiejętność pisania testów jednostkowych.

+0

nie znaleziono strony.! proszę zaktualizować –

Powiązane problemy