2013-08-07 3 views
10

ich einen WCF-Dienst, die zwei Serviceverträge implementiert ...Wie schreibt man sich zwei WCF Serviceverträge mit Autofac

public class MyService : IService1, IService2 

und ich bin selbst Hosting der Service ...

host = new ServiceHost(typeof(MyService)); 

Alles funktionierte gut, als der Service nur einen Servicevertrag implementierte, aber wenn ich versuche, Autofac einzurichten, um beide so zu registrieren:

... es gibt eine Ausnahme für die zweite aus:

Der Wert konnte nicht zur Sammlung hinzugefügt werden, da die Sammlung bereits ein Element desselben Typs enthält: 'Autofac.Integration.Wcf. AutofacDependencyInjectionServiceBehavior '. Diese Sammlung unterstützt nur eine Instanz jedes Typs. Ich

Auf den ersten Blick dachte, dies sagte meine beiden Verträge wurden irgendwie als die gleiche Art gesehen zu werden, aber in zweiter Lesung Ich glaube, es ist zu sagen, dass die AutofacDependencyInjectionServiceBehavior der in Rede stehenden Art ist, das heißt ich kann es nicht zweimal benutzen!

Und doch fand ich this post, die explizit zeigte er mehrfach in einer etwas anderen Form mit:

foreach (var endpoint in host.Description.Endpoints) 
{ 
    var contract = endpoint.Contract; 
    Type t = contract.ContractType; 
    host.AddDependencyInjectionBehavior(t, container); 
} 

Leider, die die gleiche Fehlermeldung gab.

Ist es möglich, mehr als einen Servicevertrag für einen Service zu registrieren, und wenn ja, wie?

Antwort

7

In der Tat mehrere Endpunkt für einen einzelnen Host mit Autofac registrieren.

Das ist wahr, dass Sie nicht mehrere AutofacDependencyInjectionServiceBehavior aber dieses Verhalten wird für alle Endpunkte und registriert sie in der ApplyDispatchBehavior Methode hinzufügen: source

Um diese Arbeit, die Sie Ihren Service AsSelf()

registrieren müssen, um
builder.RegisterType<MyService>(); 

Dann können Sie Ihren Endpunkt normalerweise konfigurieren:

host = new ServiceHost(typeof(MyService)); 
host.AddServiceEndpoint(typeof(IService1), binding, string.Empty); 
host.AddServiceEndpoint(typeof(IService2), binding, string.Empty); 

Und schließlich müssen Sie die AddDependencyInjectionBehavior mit dem sevicehost Typ nennen sich:

host.AddDependencyInjectionBehavior<MyService>(container); 

Hier ist eine kleine sample project (bezogen auf das documentation), die dieses Verhalten veranschaulicht.

+0

Danke - ich hätte es mir überlegen sollen! Ich bin froh, dass du mich falsch bewiesen hast :-) –

0

Update (die fett gedruckten Text), basierend auf @ nemesv Antwort:

Weitere Untersuchungen haben ergeben, dass mit Autofac ein kann nicht Register mehrere Endpunkte auf einem einzelnen Servicehost , wenn man die WCF Serviceverträge registriert . (Siehe Antwort des @ nemesv für den richtigen Weg, es zu tun.)

Hier ist der Grund:

Jede Form dieser Erweiterung Methode ...

host.AddDependencyInjectionBehavior<IService1>(_container); 
host.AddDependencyInjectionBehavior(t, container); 

... löst nach unten eine ServiceBehavior (gemäß Alex Meyer-Gleaves initial announcement of WCF integration in Autofac) zum Hinzufügen ...

host.Description.Behaviors.Add(behavior); 

No w Diese Behaviors Eigenschaft ist eine Instanz von KeyedByTypeCollection<TItem>, die nur ein Objekt eines bestimmten Typs enthalten kann. Da das hinzuzufügende Verhalten immer eine Instanz von AutofacDependencyInjectionServiceBehavior ist, kann daher nur ein Endpunkt hinzugefügt werden.

QED

Die Abhilfe besteht darin, mehrere ServiceHosts, jeweils mit einem einzigen Endpunkt zu verwenden.

(Als Punkt von Interesse, würde ich neugierig sein, um die Auswirkungen auf die Leistung und Skalierbarkeit zwischen diesen beiden Ansätzen zu kennen.)

+0

Würde nicht von AutofacDependencyInjectionServiceBehavior erben und Instanz dieser Hilfe zu lesen? –