2015-05-01 8 views
8

Ich verwende Unity App Block als meinen IOC-Container für meine Service-Schicht eines WCF-Projekts. Dies funktioniert sehr gut mit der Unity.WCF-Bibliothek, um es in jedem WCF-Dienst zu verbinden.RabbitMQ mit Unity IOC-Container in .NET

Ich habe vor kurzem RabbitMQ in meine Service-Schicht eingeführt und verwende derzeit die "using" -Blöcke zum Verbinden und Hinzufügen zur Warteschlange. Ich mag das aber nicht und versuche, die HierachicalLifetimeManager zu verwenden, um meine Verbindung zu RabbitMQ zu erstellen und zu zerstören, wie ich sie brauche? Klingt das richtig?

Ich bin auf der Suche nach einer Probe davon, oder zumindest eine Anleitung für den besten Ansatz? (zB sollte ich die Verbindung kapseln und in jeden Dienst bei Bedarf einkapseln? Wie würde ich RabbitMQ-Verbraucher etc. einkapseln?)

Antwort

3

Ich würde empfehlen, die als Singleton registrieren.

Um die als Singleton in Unity zu registrieren, würden Sie eine ContainerControlledLifetimeManager, z.

var connectionFactory = new ConnectionFactory 
{ 
    // Configure the connection factory 
}; 
unityContainer.RegisterInstance(connectionFactory); 

unityContainer.RegisterType<IConnection, AutorecoveringConnection>(new ContainerControlledLifetimeManager(), 
    new InjectionMethod("init")); 

Das AutorecoveringConnection Beispiel einmal zum ersten Mal bleibt aufgelöst am Leben, bis der Besitz UnityContainer angeordnet ist.

Da wir die ConnectionFactory mit Unity registriert haben, wird diese automatisch in den Konstruktor AutorecoveringConnection eingefügt. Die InjectionMethod stellt sicher, dass beim ersten Auflösen des AutorecoveringConnection die Methode init aufgerufen wird.

Wie für Ihre Frage darüber, ob Sie RabbitMQ von Ihren Diensten weg abstrahieren sollten, wäre meine Antwort ja, aber ich würde nicht einfach eine IMessageQueue Abstraktion erstellen. Denken Sie darüber nach, wofür Sie Ihre Nachrichtenwarteschlange verwenden, um Status zu pushen? Wenn ja, haben Sie eine IStatusNotifier Schnittstelle mit einer konkreten Implementierung für RabbitMQ. Wenn Sie Updates erhalten möchten, haben Sie eine Schnittstelle IUpdateSource mit einer konkreten Implementierung für RabbitMQ. Du kannst sehen, wohin ich damit gehe.

Wenn Sie eine Abstraktion für eine Nachrichtenwarteschlange erstellen, beschränken Sie sich auf Funktionen, die nur für alle Message Queue-Implementierungen verfügbar sind. Durch eine unterschiedliche Implementierung von IStatusNotifier für verschiedene Message Queue-Implementierungen können Sie Funktionen nutzen, die für verschiedene Technologien einzigartig sind, und auch flexibel bleiben, falls in Zukunft völlig andere Technologien verwendet werden (z. B. Schreiben in eine SQL-Datenbank oder Ausgabe an eine Konsole).

+0

danke das ist großartig! –

1

Mit RabbitMQ möchten Sie Ihre IConnection die ganze Zeit wiederverwendet werden, Sie wollen es nicht ein "using" -Block. Hier ist meine IOC-Bindung mit Ninject, beachten Sie das InSingletonScope, das ist was Sie wollen.

Bind<IConnection>() 
     .ToMethod(ctx => 
        { 
         var factory = new ConnectionFactory 
         { 
          Uri = ConfigurationManager.ConnectionStrings["RabbitMQ"].ConnectionString, 
          RequestedHeartbeat = 15 
          //every N seconds the server will send a heartbeat. If the connection does not receive a heardbeat within 
          //N*2 then the connection is considered dead. 
          //suggested from http://public.hudl.com/bits/archives/2013/11/11/c-rabbitmq-happy-servers/ 
         }; 

         var con = new AutorecoveringConnection(factory); 
         con.init(); 
         return con; 
        }) 
     .InSingletonScope(); 
+0

danke für die Antwort. Sehen Sie einen Wert für die Abstraktion der rabbitmq-Implementierung? Ich kann mir vorstellen, dass es sehr schwierig für dich sein wird, die Warteschlange zu wechseln, wenn du es wirklich brauchst. –

+0

könntest du mir auch ein einfaches Beispiel dafür geben, dass es dann benutzt wird? –

+1

Ja, wir abstrahieren Kaninchen weg. Der Code kennt nur einen IMessageBusProducer, von dem er weiß, dass er Nachrichten an einen "Nachrichtenbus" sendet. Wir können dann Rabbit, MSMQ verwenden, was immer wir wollen. – jhilden