Dies ist mehr wie eine gute Übungsfrage. Ich möchte verschiedene generische Bibliotheken wie Logging, Caching usw. anbieten. Es gibt viele Bibliotheken von Drittanbietern wie MS Enterprise Library, Log4Net, NCache usw. für diese.
Ich wollte wissen, ob es eine gute Übung ist, diese direkt zu verwenden oder einen Wrapper für jeden Dienst zu erstellen. Verwenden Sie einen DI, um diesen Dienst in den Code einzufügen.
Grüße
Das ist subjektiv, hängt aber auch von der Bibliothek ab.
Zum Beispiel haben log4net oder NHibernate streng schnittstellenbasierte APIs . Sie müssen sie nicht einpacken. Es gibt andere Bibliotheken, die Ihre Klassen schwer testen lassen, wenn Sie keine Schnittstellen dazwischen haben. Da wäre es vielleicht ratsam, eine saubere Schnittstelle zu schreiben.
Es ist manchmal gut, nur einen kleinen Teil des Codes auf APIs wie NHibernate oder eine GUI-Bibliothek zugreifen zu lassen. (Hinweis: Dies ist kein Wrapping, dies erstellt Abstraktionsebenen .) Auf der anderen Seite ist es nicht sinnvoll, den Zugriff auf log4net-Aufrufe zu reduzieren, da dies in der gesamten Anwendung verwendet wird. p>
log4net ist wahrscheinlich ein gutes Beispiel, bei dem das Wrapping einfach übertrieben ist. Manche Menschen leiden an "Wrappitis", was ein Anti-Muster ist (manchmal auch als "Wolle in Baumwolle wickeln" ) und produziert einfach mehr Arbeit. Log4net hat solch eine einfache API und ist sehr anpassbar, sie haben es besser gemacht, als Ihr Wrapper höchstwahrscheinlich sein wird.
Sie werden feststellen, dass das Umpacken einer Bibliothek es nicht erlaubt, sie einfach mit einem anderen Produkt auszutauschen. Das Aktualisieren auf neuere Versionen wird auch nicht einfacher sein, stattdessen müssen Sie Ihren Wrapper umsonst aktualisieren.
Wenn Sie Implementierungen dieser Konzepte austauschen möchten, sollten Sie einen Wrapper erstellen.
Für die Protokollierung gibt es bereits so etwas Common.Logging .
Die Verwendung von Wrapping-Interfaces macht zwar die Unit-Tests viel einfacher, aber was genauso wichtig ist, macht es möglich, Mocks zu verwenden.
Als Beispiel definiert das PRISM-Framework für Silverlight und WPF eine Schnittstelle ILoggerFacade
mit einer einfachen Methode namens Log
. . Mit diesem Konzept definiere ich einen verspotteten Logger (mit Moq ) in meinen Komponententests:
Später können Sie loggerMock.Object
über Konstruktor oder Eigenschaft an das getestete Objekt übergeben oder einen Dependency Injector konfigurieren, der es verwendet.
Es klingt, als ob Sie daran denken, die Logging-Implementierung zu verpacken und dann mit verschiedenen Teams zu teilen. Darauf aufbauend gibt es einige Vor- und Nachteile.
Ich habe bereits einen Teil der Enterprise Library umgebrochen und fand es nicht viel wertvoller. Ich denke, du wärst besser dran:
Dies ist eher eine subjektive Frage, aber IMO ist es eine gute Sache, jede anwendungs- / bibliotheksspezifische Verwendung in ein Servicemodelldesign zu integrieren, das über durchdachte Schnittstellen verfügt, so dass Sie DI und später, wenn Sie einmal wechseln müssen, einfach verwenden können sagen EntLib Data Application Block zu NHibernate Sie brauchen nicht neu zu architect Sie ganze Anwendung.
Im Allgemeinen erstelle ich eine "Helfer" - oder "Service" -Klasse, die statisch aufgerufen werden kann, um die allgemeine Funktionalität dieser Bibliotheken zu umhüllen.
Ich weiß nicht, dass es ein enormes Risiko gibt, diese direkt zu referenzieren / aufzurufen, da es definitiv ausgereifte Projekte sind (zumindest EntLib und Log4Net), aber ein Wrapper isoliert Sie vor der Verwirrung der Versionsänderung, usw. und gibt Ihnen in der Zukunft mehr Optionen zu relativ niedrigen Kosten.
Ja , wenn es jetzt oder in einer vernünftigen Zukunft möglich ist, die Implementierung zu ersetzen.
Nein andernfalls.
Das Definieren der Schnittstelle, die Ihre Anwendung für alle Zwecke der Protokollierung / Unternehmung / ... verwenden wird, ist die Kernaufgabe hier. Das Schreiben des Wrappers ist lediglich eine Möglichkeit, den Compiler dazu zu bringen, diese Schnittstelle anstelle der eigentlichen Implementierung zu verwenden.
Tags und Links c# enterprise-library