Alternative zu Httpcontext, wenn ninject mit einem WCF-Dienst gehostet Verwendung in MSMQ wurde mit Bindung

StackOverflow https://stackoverflow.com/questions/2046704

  •  20-09-2019
  •  | 
  •  

Frage

Ich habe eine einfache Fahrt WCF-Dienst mit der MSMQ Bindung, die in IIS 7.0 Windows-Aktivierungsdienst aktiviert wird, verwendet wird.

Ich bin ein großer Fan auf ninject so habe ich die ninject Erweiterung für WCF eingesetzt haben, der für einen typischen HTTP-WCF-Dienst groß funktionieren würde.

Allerdings war in activate Dienste gibt keine HTTP-Pipeline ist, so kann ich nicht InRequestScope verwenden, wenn meine Typen Bindung weil System.Web.HttpContext.Current null ist. Ich bin zu kämpfen, eine Alternative zu finden, wenn wurde mit, dass mir geben wird, was ich will. AspCompatibility Modus Attribut nicht funktioniert in diesem Modus auch nicht.

Ich dachte InThreadScope funktionieren könnte, aber der Service ist in einem separaten Thread erstellt als das, was es in ausgeführt wird.

Also im Grunde muss ich das Äquivalent der die Httpcontext für WCF + zu Umfang war meine Objekte auf Antrag Ebene. Gibt es ein statisches Objekt in dieser Welt, die auf die gleiche Weise oder hat jemand irgendwelche Ideen, etwas funktionieren würde ich zusammen hacken?

War es hilfreich?

Lösung

implementiert ich meine eigenen WCF-Erweiterungen für Ninject 2.0, bevor ich wusste, dass es ein this bis auf gitHub. Meine Implementierung unterscheidet sich leicht, aber ich habe mit einer Lösung zu Scoping Objekte kommen:

using System;
using Ninject.Activation;

namespace Ninject.Contrib.Wcf {
  /// <summary>
  /// Defines Scope Callbacks for WCF Context.
  /// </summary>
  public class NinjectWcfScopeCallbacks {
    /// <summary>
    /// Defines WCF Context scope.
    /// </summary>
    public static readonly Func<IContext, object> WcfContext =
      ctx => (System.ServiceModel.OperationContext.Current != null
                ? System.ServiceModel.OperationContext.Current.
                    InstanceContext.
                    Extensions.Find<NinjectInstanceContext>()
                : null);

    /// <summary>
    /// Defines WCF Web Context scope.
    /// </summary>
    public static readonly Func<IContext, object> WcfWebContext = 
               ctx => System.ServiceModel.Web.WebOperationContext.Current;
  }
}

Für die Vollständigkeit, das ist, wie ich den Rückruf verwenden vorstehend definiert ist:

Bind<IHelloWorldService>()
        .To<HelloWorldService>()
        .InScope(NinjectWcfScopeCallbacks.WcfWebContext);

Die nicht gehosteten WCF-Dienste in WAR, so dass nicht sicher, ob Sie die WcfWebContext oder WcfContext oben definiert verwenden würde, aber man kann versuchen, sie heraus und sehen. Wenn WebOperationContext funktioniert, dann bist du ganz eingestellt. Ansonsten fand ich die Dinge ein wenig komplizierter. Hier finden Sie den Code-Schnipsel oben verwendet eine NinjectInstanceContext Klasse beachten Sie, dass an den OperationContext angebracht ist. Dies ist eine Klasse schrieb ich, dass Verwendungen Ninject 2.0 des „Cache und collect“ Mechanismus, Objekte zu deterministisch angeordnet werden können. Grundsätzlich ist die Klasse implementiert IExtension<InstanceContext>, das ein WCF-Konstrukt zur Befestigung fast alles an den OperationContext. Diese Klasse auch Ninject der INotifyWhenDisposed Schnittstelle implementieren das ist, was die Unterstützung für deterministische Verfügung stellt. Hier ist, was die Klassendefinition sieht aus wie:

  /// <summary>
  /// Defines a custom WCF InstanceContext extension that resolves service instances
  /// using Ninject.  
  /// <remarks>
  /// The custom InstanceContext extension provides support for deterministic disposal
  /// of injected dependencies and service instances themselves by being hook into 
  /// Ninject's "cache and collect" mechanism (new in Ninject 2.0) for object life cycle 
  /// management.  This allows binding object instances to the lifetime of a WCF context
  /// and having them deterministically deactivated and disposed.
  /// </remarks>
  /// </summary>
  public class NinjectInstanceContext : 
                IExtension<InstanceContext>, INotifyWhenDisposed {
  }

Der Rest meiner WCF-Erweiterung für Ninject ist das gleiche wie die eines auf gitHub. Was im Grunde passiert, ist, dass eine Instanz Anbieter geschaffen, die in die WCF „Aktivierung“ Kette angeschlossen werden - ich bin ihre spezifische Terminologie nicht verwenden, nur, wie ich die Dinge zu verstehen. So ist die Idee, dass die Instanz-Anbieter Versorgungs Instanzen der WCF-Dienstklasse soll angefordert wird. Also, hier, wo wir Ninject verwenden, um die Service-Instanz zu erzeugen. Auf diese Weise können wir auch aktivieren und injizieren alle Abhängigkeiten. Was die Instanz-Provider tut in meiner Implementierung ist die Ninject Kernel in einer Instanz, wenn NinjectInstanceContext einpacken und befestigen Sie es an der OperationContext. Die Schaffung des Dienstes wird dann auf diese WCF Erweiterung delegiert. Wenn die Instanz-Provider gesagt wird ein Dienst freizugeben, die NinjectInstanceContext, die auf die Operation angebracht wurde, wird (ihre Abhängigkeiten und potentiell) angeordnet sind, die über die Umsetzung INotifyWhenDisposed bewirkt deter Entsorgung des Dienstes.

Hope diese Diskussion hilft. Ich werde sehen, ob ich etwas konkretere Code bekommen können hier gebucht, wenn Sie daran interessiert sind.

Andere Tipps

Ich bin sicher, OperationContext ist das, was Sie suchen

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top