Ist es eine gute Vorgehensweise, einen Wrapper über Komponenten von Drittanbietern wie MS Enterprise Library oder Log4net zu erstellen?

8

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

    
rauts 03.11.2009, 14:21
quelle

8 Antworten

8

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.

    
Stefan Steinegger 03.11.2009, 14:33
quelle
4

Wenn Sie Implementierungen dieser Konzepte austauschen möchten, sollten Sie einen Wrapper erstellen.

Für die Protokollierung gibt es bereits so etwas Common.Logging .

    
BennyM 03.11.2009 14:26
quelle
2

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:

%Vor%

Später können Sie loggerMock.Object über Konstruktor oder Eigenschaft an das getestete Objekt übergeben oder einen Dependency Injector konfigurieren, der es verwendet.

    
Konamiman 03.11.2009 14:46
quelle
2

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.

Vorteile von Wrapping

  • Kann Interfaces abstrahieren und Abhängigkeiten von der Implementierung. Dies bietet einen gewissen Schutz vor brechenden Änderungen in der Implementierungsbibliothek.
  • Kann erleichtern die Durchsetzung von Standards Richten Sie verschiedene Projekte aus Implementierungen.

Nachteile von Wrapping

  • Zusätzliche Entwicklungsarbeit.
  • Mögliche zusätzliche Dokumentation arbeiten (wie man neue Bibliothek benutzt).
  • Mehr wahrscheinlich Fehler in der Verpackung Code als reife Bibliothek. (Das Bereitstellen von Bugfixes kann große Kopfschmerzen bereiten!)
  • Entwickler müssen neue Bibliothek lernen (auch wenn sehr einfach).
  • Kann manchmal sein schwierig, eine ganze Bibliothek zu wickeln um eine undichte Implementierung zu vermeiden Schnittstellen. Diese Arten von Wrapper Klassen bieten normalerweise keinen anderen Wert als Verschleierung. z.B. MyDbCommand Die Klasse umschließt einen anderen DbCommand Klasse.

Ich habe bereits einen Teil der Enterprise Library umgebrochen und fand es nicht viel wertvoller. Ich denke, du wärst besser dran:

  • Dokumentieren der besten Praktiken und Verwendung
  • Bereitstellung einer Referenzimplementierung
  • Überprüfung der Einhaltung (Code Reviews usw.)
Randy Levy 03.11.2009 19:12
quelle
1

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.

    
Chris Marisic 03.11.2009 14:25
quelle
1

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.

    
Guy Starbuck 03.11.2009 14:26
quelle
0

Ich denke, es ist besser, einen Wrapper persönlich zu verwenden, weil dies Dinge sind, die Sie nicht ausführen möchten, wenn Ihre Komponententests ausgeführt werden (vorausgesetzt, Sie testen auch Unit-Tests).

    
Jimmeh 03.11.2009 14:26
quelle
0

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.

    
peterchen 03.11.2009 19:20
quelle

Tags und Links