2010-11-26 13 views
0

Je tente de configurer le client pour un service WCF bidirectionnel via Unity 2.0. Pour ce faire, je veux insérer une implémentation de mon CallbackContract - IUpdateClient - dans un InstanceContext, qui est ensuite inséré dans mon proxy de service, dans ce cas une sous-classe de DuplexClientBase<IUpdateService> appelée UpdateProxy.L'unité ne parvient pas à résoudre correctement l'implémentation InstanceContext de WCF

Le problème que je rencontre est, lors d'une tentative d'utiliser le proxy comme stocké dans mon conteneur Unity pour souscrire le client aux mises à jour du service, je reçois l'exception suivante:

Le InstanceContext fourni au ChannelFactory contient un UserObject qui n'implémente pas le CallbackContractType '..Services..ServiceContracts.IUpdateClient'.

J'accède au proxy comme ceci:

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

Compte tenu de ma config unité:

<!-- 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> 

j'attendre à ce que quand je résous la classe UpdateService, vu ici:

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

    public void Subscribe() {} 

    [...] 
} 

Que le conteneur Unity instancie un InstanceContext (enregistré comme "instanceContext" dans config) et, ce faisant, il doit instancier le type enregistré comme "updateClientImpl" - qui implémente en fait IUpdateClient - et le passe dans le constructeur du InstanceContext en tant que paramètre implementation.

Néanmoins, je reçois l'erreur comme ci-dessus.

En résumé (alias "the tl; dr version"): Lorsque le conteneur Unity résout un InstanceContext, il ne semble pas créer correctement son implémentation. Je ne sais pas s'il s'agit d'une erreur de configuration ou si je comprends mal comment le conteneur Unity résout un ensemble de types dépendants. Toute orientation à ce sujet serait utile.

Répondre

0

Le problème que vous rencontrez est dû au fait que vous avez enregistré le InstanceContext avec un nom. Toutefois, le type UpdateProxy n'est pas enregistré du tout. Donc, ce qui se passe est que le conteneur tentera de résoudre InstanceContext en utilisant l'enregistrement par défaut, sans nom. Cependant, comme il n'y a pas d'enregistrement par défaut, les valeurs par défaut sont activées et il semble que l'on choisisse un constructeur différent. Le correctif consisterait à enregistrer UpdateProxy et à définir cet enregistrement pour utiliser l'enregistrement nommé pour InstanceContext ou pour supprimer le nom de l'enregistrement pour InstanceContext.