2016-05-25 10 views
0

richtig einen Dienst in WCF-Dienst und anderen Diensten zu injizieren Wenn zwei wie folgt definiert WCF-Dienste sind:Wie durch die Verwendung SimpleInjector

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)] 
public class WcfService1: IWcfService1 
{ 
    private IService1 _service1; 
    public WcfService(IService1 service1){ 
     _service1 = service1; 
    } 
} 

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)] 
public class WcfService2: IWcfService2 
{ 
    private IService2 _service2; 
    public WcfService(IService2 service2){ 
     _service2 = service2; 
    } 
} 

und wenn die Service2 in Service1 injiziert wird, welches der beste Weg ist, um Service2 mit SimpleInjector registrieren?

ähnliche

container.RegisterPerWcfOperation<IService1, Service1>();  
container.RegisterPerWcfOperation<IService2, Service2>(); 

oder ähnliche

container.RegisterPerWcfOperation<IService1, Service1>();  
container.Register<IService2, Service2>(Lifestyle.Scoped); 

Der Behälter wie folgt konfiguriert ist:

container.Options.DefaultScopedLifestyle = new WcfOperationLifestyle(); 
+0

Die Antwort hängt vollständig davon ab, was Sie brauchen. Benötigen Sie für die Dauer einer einzelnen Anfrage genau eine Instanz von Service2? – Steven

+0

Wenn ich einen WcfService1-Endpunkt anfordere, benötige ich eine Instanz von Service2, die nach dem Aufruf zerstört werden sollte. Wenn ich einen WcfService2-Endpunkt anfordere, benötige ich auch eine Instanz von Service2, die nach diesem Aufruf ebenfalls zerstört werden sollte. – kord

+0

Sie können sie sogar als Transient (der Standard-Lebensstil) registrieren. – Steven

Antwort

2

Erstens, die Verwendung der (alten) Erweiterungsmethoden wie RegisterPerWcfRequest wird abgeraten, da die Verfügbarkeit des neuen Lifestyle.Scoped richtig ist ty. Lifestyle.Scoped bietet ein einfacheres, lesbareres und flexibleres Modell zum Registrieren von Bereichsinstanzen, während derselbe zugrunde liegende Lebensstil verwendet wird, da Sie dies über Options.DefaultScopedLifestyle festlegen.

Da darüber hinaus jeder WCF Aufruf zu einem Dienst in seinem eigenen Wunsch läuft, ein neuer Bereich vorhanden ist und jeder Dienst seine eigene Instanz von Service2, egal, ob Sie es als Transient oder Scoped registrieren. Nur wenn Sie es als Singleton registrieren, werden Sie die gleiche Instanz von Service2 über Anfragen wieder verwendet werden; In der Tat, mit Singleton wird es nur eine Instanz von Service2 für die Lebensdauer Ihres WCF-Dienstes geben.

hier die eigentliche Frage ist, ob WcfService1 oder WcfService2 auf andere Klassen hängen ab, die direkt oder indirekt auf Service2 auch, muss die gleiche Instanz von Service2 während dieser Anforderung verwendet werden, oder ist es in Ordnung, Service2 mehrere Instanzen haben während dieser einzelnen Anfrage? Wenn mehrere Instanzen in Ordnung sind, können Sie sie als Transient registrieren, andernfalls als Scoped.

Die folgenden Registrierungen werden den Zweck erfüllen, wenn Sie möchten, dass Ihre Komponenten den vorübergehenden Lebensstil haben.

container.Register<IService1, Service1>();  
container.Register<IService2, Service2>(); 
+0

Es macht vollkommen Sinn. Danke Steven! – kord