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.