Das wird auch nervig - es ist nicht trocken
Das stimmt. Aber es gibt nur so viel, was Sie für ein Querschnittsthema tun können, das jeden Typ durchdringt, den Sie haben. Sie müssen verwenden Sie den Logger überall, so dass Sie die Eigenschaft auf diesen Typen haben müssen.
Mal sehen, was wir dagegen tun können.
Singleton
Singletons sind schrecklich <flame-suit-on>
.
Ich empfehle, bei der Eigenschaftsinjektion zu bleiben, wie Sie es bei Ihrem zweiten Beispiel getan haben. Dies ist das beste Factoring, das Sie durchführen können, ohne auf Magie zurückzugreifen. Es ist besser, eine explizite Abhängigkeit zu haben, als sie über einen Singleton auszublenden.
Aber wenn Singletons Ihnen viel Zeit sparen, einschließlich aller Umgestaltungen, die Sie jemals durchführen müssen (Kristallkugelzeit!), Können Sie wahrscheinlich mit ihnen leben. Wenn es jemals eine Verwendung für einen Singleton gab, könnte dies der Fall sein. Denken Sie daran , dass die Kosten, wenn Sie jemals Ihre Meinung ändern möchten, so hoch wie möglich sind.
Wenn Sie dies tun, überprüfen Sie die Antworten anderer Personen anhand des Registry
Musters (siehe Beschreibung) und derjenigen, die eine (zurücksetzbare) Singleton- Factory anstelle einer Singleton-Logger-Instanz registrieren .
Es gibt andere Alternativen, die ohne Kompromisse genauso gut funktionieren könnten. Sie sollten sie daher zuerst überprüfen.
Visual Studio-Codefragmente
Sie können Visual Studio-Codefragmente verwenden , um die Eingabe dieses sich wiederholenden Codes zu beschleunigen. Sie können so etwas logger
tabeingeben und der Code wird auf magische Weise für Sie angezeigt.
Mit AOP abtrocknen
Sie können ein wenig von diesem Eigenschaftsinjektionscode entfernen , indem Sie ein AOP-Framework (Aspect Oriented Programming) wie PostSharp verwenden, um einen Teil davon automatisch zu generieren.
Es könnte ungefähr so aussehen, wenn Sie fertig sind:
[InjectedLogger]
public ILogger Logger { get; set; }
Sie können auch den Beispielcode für die Methodenverfolgung verwenden, um den Eingangs- und Ausgangscode für Methoden automatisch zu verfolgen, sodass möglicherweise nicht alle Logger-Eigenschaften zusammengefügt werden müssen. Sie können das Attribut auf Klassenebene oder im gesamten Namespace anwenden:
[Trace]
public class MyClass
{
}
#if DEBUG
[assembly: Trace( AttributeTargetTypes = "MyNamespace.*",
AttributeTargetTypeAttributes = MulticastAttributes.Public,
AttributeTargetMemberAttributes = MulticastAttributes.Public )]
#endif