RabbitMQ: die Injektion der Verbindung Fabrik
Ich bin versuchen, RabbitMQ für ein paar Windows-Dienste, die ich Schreibe, zur Erleichterung der Kommunikation zwischen Ihnen auf eine schnelle und zuverlässige Art und Weise. Allerdings bin ich im laufen in ein problem, wenn die versuchen, die wichtigsten windows-Dienst-Motoren, die brauchen, um verbindungen zu der RabbitMQ-server Ihr Ding machen.
Grundsätzlich die ConnectionFactory
Objekt in RabbitMQ ist .NET-client ist nicht Abstrakt und implementiert keine Schnittstelle. Ich kann nicht sehen, eine offensichtliche Weg, um zu injizieren, diese Klasse mit einem IoC-container wie StructureMap. Auch die code-Beispiele in der Dokumentation zeigen nur krass new
ing it up, etwa so:
ConnectionFactory factory = new ConnectionFactory();
factory.Uri = "amqp://user:pass@hostName:port/vhost";
IConnection conn = factory.CreateConnection();
Die Lösung, die sich mir stellt ist, schieben Sie die ganze Fabrik in den Dienst der Haupt - OnStart
und OnStop
Funktionen, die wirklich schwierig zu testen, und nicht von großem Interesse sowieso. Jedoch, lässt mich mit einem einzigen IConnection
für den service, also, wenn eine Verbindung unterbrochen wird, in irgendeiner Weise hat der Dienst keine Möglichkeit, sich zu erholen und muss einfach beenden. Wenn die Hauptmaschine hatte Sicht auf die Fabrik, es könnte einfach produzieren ein neuer Anschluss und weiter. Aber wenn ich Spritzen, dass es keine Möglichkeit zum testen der Hauptmaschine, ohne eine Verbindung zu einem vorhandenen server!
Gibt es irgendetwas, was ich hier vermisst? Eine andere option bin ich nicht in Betracht? Wie kann ich mich über die Injektion dieser Fabrik, und wenn ich nicht kann, wie kann ich den Schaden begrenzen?
EDIT: Auch, im Nachhinein, bin ich vollkommen glücklich zu machen, eine Veränderung zu RabbitMQ ist .NET-client eine Schnittstelle implementieren, wenn jemand eine gute Idee hat, wie empfänglich der Haupt-dev-team wäre, um eine änderung wie diese. Ich würde gerne dazu beitragen, aber das Letzte, was ich will zu tun ist, haben meine Programme funktioniert auf einigen custom-version von RabbitMQ, wodurch der Hauptvorteil der Verwendung einer Drittanbieter-Bibliothek in den ersten Platz.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Der schwierige Teil ist, es sieht aus wie nach dem Dokumentation
ConnectionFactory
nicht implementieren Schnittstellen.Du bist also wirklich gelassen mit der Umsetzung Ihrer eigenen, so etwas wie
Für die Klasse, wo Sie landen, es zu benutzen,
Den RabbitMQ-C# - client ist ein low-level-pureish AMQP Umsetzung, würden Sie wahrscheinlich wollen, um wickeln Sie es in etwas höheren Ebene der Abstraktion, und dann zu registrieren, dass Sie mit der IoC-container.
EasyNetQ, eine höhere Ebene der Abstraktion, die über den basic-client implementiert einen persistenten AMQP-Verbindung wieder her, nachdem eine Verbindung unterbrochen wurde (entweder über Netzwerk oder einen server bounce), und erstellt alle aktuellen Abonnements. Sie sind willkommen, nehmen an, dass der code, den Sie nützlich finden.
Kurz, es ist eine Frage der Verpackung connection-management in eine Art PersistentConnection Klasse, und dann die Registrierung jedes Abonnement mit etwas code, um neu zu erstellen, nach einem erfolgreichen reconnect.
Habe ich geschrieben ein blog-post auf die Verkabelung bis EasyNetQ, Windsor IoC-container und TopShelf. Ich habe diese Technik erfolgreich für den Aufbau RabbitMQ basiert die windows-Dienste.
Successfully installed 'RabbitMQ.Client 2.8.6'. Successfully installed 'Newtonsoft.Json 4.5.10'. Successfully installed 'EasyNetQ 0.8.1.37'. Install failed. Rolling back... Already referencing a newer version of 'RabbitMQ.Client'.