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?
Odpowiedz
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ówISecurityValidator<T>
stosowania ograniczeń zabezpieczeń wiadomościIRepository<T>
, repozytorium wzórIAuthorizationFilter<T>
dotyczące stosowania filtrowania autoryzacji/zabezpieczeń na zapytaniachIQueryable<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.
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.
nie znaleziono strony.! proszę zaktualizować –
Dlaczego blisko? A może poświęcisz czas i zostawisz komentarz? – aryaxt
-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. –
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