Wrapping NServiceBus.IHandleMessages

7

Ich werde gebeten, eine Schicht zu entwickeln, die als generischer Bus ohne beliebige direkte Verweise auf NServiceBus fungiert. Was bisher dank der Unterstützung für unauffällige Nachrichten nicht zu schwer ist. Außer jetzt wurde ich gebeten, eine eigene Definition für IHandleMessages bereitzustellen und einen Weg zu finden, um es während der Verkabelung abzubilden. Also denke ich etwa so:

%Vor%

Wo IHandle wäre unsere eigene Definition (die übrigens genau das gleiche wie IHandleMessages ist). Ich würde erwarten, über die AppDomain zu reflektieren und alle Klassen zu finden, die IHandle implementiert und sie mit dem Container registrieren, dann einen MessageHandlerAdapter mit dem gleichen Typ T registrieren.

Mein Problem ist, dass ich NServiceBus seit fast 2 Jahren nicht mehr benutzt habe und ich mich nicht mehr erinnere, wo ich diese Art von Funktionalität in der NSB-Pipeline einbinden sollte.

    
Mark J Miller 17.01.2013, 21:27
quelle

1 Antwort

40

Sie werden diese Antwort wahrscheinlich nicht mögen, aber ... Schreiben Sie keine Abstraktionsschichten für die von Ihnen verwendeten Werkzeuge.

Ich habe viele Fälle gesehen, in denen Leute versuchen, eine Abstraktionsebene um bestimmte Werkzeuge herum zu schreiben. Meistens handelt es sich um Logging- und ORM-Frameworks. Jetzt haben die Leute gute Absichten, wenn sie das tun. Sie wollen "die Bibliothek X leicht wechseln können". Leider ist dies aus verschiedenen Gründen eine schlechte Idee.

  • Inkompatible Konzepte. In Ihrem Beispiel könnten Sie das Konzept eines NSB Saga Timeouts herausziehen. Es gibt jedoch keine Garantie, dass sich dieses Konzept in der theoretischen "Bibliothek, auf die in Zukunft umgestellt werden soll" genauso verhalten wird oder dass das Konzept überhaupt existiert. Gewöhnlich enden diese "Abstraktionsschichten" als direkte Karte einer einzelnen Bibliothek und sind überhaupt nicht portierbar.
  • Zusätzliche Komplexität. Sie werden Ihrer Lösung eine große Menge an Komplexität hinzufügen.
  • Samples funktionieren nicht. Wenn Sie sich Beispiele der Bibliothek ansehen, müssen Sie Ihre Abstraktionsschicht in Ihre Abstraktionsschicht einbinden
  • Zugangsbeschränkung. Während neue Entwickler, die Ihrem Team beitreten, die betreffende Bibliothek möglicherweise verwendet haben, werden sie Ihr Wrapper nicht verstehen
  • Kampf gegen die API. Keine Bibliothek wird jemals mit der Funktion "eine gemeinsame Implementierung extrahieren" entworfen. Aus diesem Grund wird die API Sie aktiv gegen diese Aktivität kämpfen.
  • Debuggen. Eine zusätzliche Ebene macht es schwieriger, Ihre Lösung zu debuggen
  • Leistung. Im Allgemeinen ist mehr Code langsamer Code. Oftmals müssen diese Abstraktionsschichten Reflektionen verwenden ...
  • Unterstützung. Sie werden es schwieriger machen, Unterstützung von den Personen zu erhalten, die die Bibliothek besitzen, da es schwierig sein wird zu dokumentieren, wie Sie mit der Bibliothek interagieren.
  • Laufende Änderungen. Jedes Mal, wenn die betreffende Bibliothek eine API hinzufügt oder ändert, müssen Sie Mapping-Code hinzufügen, bevor Sie diese Funktionalität in Ihrer Lösung nutzen können.
  • Dokumentation. Oft sind riesige Mengen an Arbeitsstunden in die Erstellung von Dokumentationen für die Bibliotheken investiert worden. Es wird eine erhebliche Anstrengung sein, die Dokumentation für Ihre Abstraktion auf diese Ebene zu bringen.

Es kommt alles auf die Zeit herunter. Sie versuchen nun, Zeit damit zu verbringen, das Tool zu abstrahieren. Mit der Hoffnung, in Zukunft mehr Zeit zu sparen. Das Problem ist, dass Sie viel mehr Zeit damit verbringen werden, diese Abstraktion zu erstellen und zu erhalten, als Sie jemals speichern würden, wenn Sie sich für einen Wechsel entscheiden. Dies sollte Ihre Antwort auf Ihre Mitarbeiter sein.

Hier ist ein interessanter Beitrag von Ayende, der über die Übel der Abstraktion spricht. Vieles davon ist auf dieses Szenario anwendbar: Ссылка Um zu zitieren

  

... versuch unnötige Komplexität zu vermeiden ... Zusätzliche hinzufügen   Schichten von Abstraktionen machen es normalerweise nur schwer.

    
Simon 17.01.2013, 22:52
quelle

Tags und Links