To też staje się denerwujące - nie jest SUCHE
To prawda. Ale tylko tyle możesz zrobić dla przekrojowego problemu, który przenika każdy twój typ. Musisz używać loggera wszędzie, więc musisz mieć właściwość na tych typach.
Zobaczmy więc, co możemy z tym zrobić.
Singel
Singletony są okropne <flame-suit-on>
.
Zalecam trzymać się wstrzykiwania właściwości, tak jak zrobiłeś to na drugim przykładzie. To najlepszy faktoring, jaki możesz zrobić bez uciekania się do magii. Lepiej jest mieć wyraźną zależność niż ukrywać ją za pomocą singletona.
Ale jeśli singletony zaoszczędzą ci dużo czasu, w tym wszystkie refaktoryzacje, które będziesz musiał kiedykolwiek wykonać (czas kryształowej kuli!), Przypuszczam, że możesz z nimi żyć. Jeśli Singleton kiedykolwiek miałby zastosowanie, to może być to. Pamiętaj, że koszt, jeśli kiedykolwiek zechcesz zmienić zdanie, będzie tak wysoki, jak to tylko możliwe.
Jeśli to zrobisz, sprawdź odpowiedzi cudzych korzystania z Registry
wzoru (patrz opis), a ci rejestracji (Reset możliwy) singleton fabryki zamiast instancji Singleton rejestratora.
Istnieją inne alternatywy, które mogą działać równie dobrze bez większego kompromisu, więc powinieneś je najpierw sprawdzić.
Fragmenty kodu programu Visual Studio
Możesz użyć fragmentów kodu programu Visual Studio, aby przyspieszyć wprowadzanie tego powtarzalnego kodu. Będziesz mógł wpisać coś takiego logger
tab, a kod magicznie pojawi się dla Ciebie.
Używanie AOP do SUSZENIA
Możesz wyeliminować trochę tego kodu iniekcji właściwości, używając struktury programowania zorientowanego na aspekty (AOP), takiej jak PostSharp, aby automatycznie wygenerować część z nich.
Kiedy skończysz, może to wyglądać mniej więcej tak:
[InjectedLogger]
public ILogger Logger { get; set; }
Możesz również użyć ich przykładowego kodu śledzenia metod, aby automatycznie śledzić kod wejścia i wyjścia metody, co może wyeliminować potrzebę dodawania wszystkich właściwości programu rejestrującego. Możesz zastosować atrybut na poziomie klasy lub całej przestrzeni nazw:
[Trace]
public class MyClass
{
}
#if DEBUG
[assembly: Trace( AttributeTargetTypes = "MyNamespace.*",
AttributeTargetTypeAttributes = MulticastAttributes.Public,
AttributeTargetMemberAttributes = MulticastAttributes.Public )]
#endif