2010-11-26 11 views
0

Ich versuche, den Client für einen Duplex-WCF-Dienst über Unity 2.0 einzurichten. Dazu möchte ich eine Implementierung meines CallbackContract - IUpdateClient - in eine InstanceContext einfügen, die dann in meinen Service-Proxy eingefügt wird, in diesem Fall eine Unterklasse von DuplexClientBase<IUpdateService>, genannt UpdateProxy.Unity konnte WCF InstanceContext-Implementierung nicht korrekt beheben

Das Problem, das mir begegnet wird, wenn die Proxy in meinem Unity Container als gespeichert zu verwenden versuchen, die Client-Updates aus dem Dienst zu abonnieren, ich die folgende Ausnahme erhalten:

Die InstanceContext zum bereitgestellt ChannelFactory enthält ein UserObject , das den CallbackContractType '..Services..ServiceContracts.IUpdateClient' nicht implementiert.

ich Zugriff auf den Proxy wie folgt:

_container.Resolve<IUpdateService>("updateServiceImpl").Subscribe(); 

meine Unity Config Gegeben:

<!-- Interface to implementation mappings --> 
<register type="RepositoryInterface" mapTo="Repository" name="repositoryImpl"> 
    <constructor> 
    <param name="proxy" dependencyName="proxyImpl"/> 
    </constructor> 
</register> 

<!-- Here's the bit that doesn't seem to be resolving as expected --> 
<register type="UpdateClientInterface" mapTo="UpdateClient" name="updateClientImpl"> 
    <lifetime type="singleton"/> 
    <constructor> 
    <param name="repository" dependencyName="repositoryImpl"/> 
    </constructor> 
</register>  
<register type="System.ServiceModel.InstanceContext, System.ServiceModel, 
Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" name="instanceContext"> 
    <constructor> 
    <param name="implementation" dependencyName="updateClientImpl"/> 
    </constructor> 
</register> 

<!-- This is the type I'm resolving with the above _container.Resolve() statement --> 
<register type="UpdateServiceInterface" mapTo="UpdateService" name="updateServiceImpl"> 
    <constructor> 
    <param name="callbackInstance" dependencyName="instanceContext"/> 
    </constructor> 
</register> 

<register type="ProxyInterface" mapTo="Proxy" name="proxyImpl"> 
    <constructor> 
    <param name="configurationName"> 
     <value value="ServiceEndpointFromAppConfig"/> 
    </param> 
    </constructor> 
</register> 

Ich würde erwarten, dass, wenn ich die Update Klasse lösen, hier zu sehen:

public class UpdateProxy : DuplexClientBase<IUpdateService>, IUpdateService 
{ 
    public UpdateProxy(InstanceContext callbackInstance) 
     : base(callbackInstance) {} 

    public void Subscribe() {} 

    [...] 
} 

Der Unity-Container instanziiert eine InstanceContext (in config als "instanceContext" registriert) und muss dann den als "updateClientImpl" registrierten Typ instanziieren - , der tatsächlich IUpdateClient implementiert - und diesen in den InstanceContext-Konstruktor als seinen implementation-Parameter übergeben.

Trotzdem erhalte ich den Fehler wie oben.

Zusammenfassung (alias "the tl; dr version"): Wenn der Unity-Container einen InstanceContext auflöst, scheint seine Implementierung nicht korrekt zu erstellen. Ich weiß nicht, ob dies ein Konfigurationsfehler ist oder ob ich grundlegend falsch verstehe, wie der Unity-Container eine Reihe abhängiger Typen auflöst. Jede Anleitung dazu wäre hilfreich.

Antwort

0

Das Problem, das Sie haben, liegt daran, dass Sie den InstanceContext mit einem Namen registriert haben. Der UpdateProxy-Typ wird jedoch überhaupt nicht registriert. Was passiert, ist, dass der Container versucht, InstanceContext mit der standardmäßigen, unbenannten Registrierung aufzulösen.

Da es jedoch keine Standardregistrierung gibt, treten die Standardeinstellungen ein und es sieht so aus, als ob ein anderer Konstruktor ausgewählt wird.

Das Update wäre UpdateProxy entweder registrieren und diese Registrierung für die Verwendung der benannten Registrierung für InstanceContext festlegen oder den Namen aus der Registrierung für InstanceContext entfernen.

Verwandte Themen