2010-10-06 13 views
0

J'ai une classe qui gère toute l'interaction dans mon application avec mon service WCF et il semble que MSDN dit que l'utilisation de l'instruction Using) _ avec WCF est mauvaise - je peux voir pourquoi est mauvais et d'accord avec cela (http://msdn.microsoft.com/en-us/library/aa355056.aspx)Plusieurs méthodes pour appeler un service WCF

mon problème est que leur méthode suggérée de mise en œuvre signifiera que j'ai 10 méthodes [comme 10 les méthodes publiques de mon service] qui auront le même code de structure et cela bien sûr ne suit pas le principal SEC - le code ressemble à ce qui suit:

try 
{ 
    results = _client.MethodCall(input parameteres); 
    _client.Close(); 
} 
catch (CommunicationException) 
{ 
    if (_client != null && _client.State != CommunicationState.Closed) 
    { 
     _client.Abort(); 
    } 
} 
catch (TimeoutException) 
{ 
    if (_client != null && _client.State != CommunicationState.Closed) 
    { 
     _client.Abort(); 
    } 
} 
catch (Exception ex) 
{ 
    if (_client != null && _client.State != CommunicationState.Closed) 
    { 
     _client.Abort(); 
    } 
    throw; 
} 

cette n'a pas encore de connexion mais bien sûr quand je viens de commencer à l'enregistrer, je vais devoir ajouter le travail de journalisation dans presque 10 endroits différents

Quelqu'un at-il des conseils sur comment je peux être un peu plus débrouillard ici en réutilisant le code

grâce

paul

Répondre

5

J'utiliser un usage général, le composant de gestion des exceptions configurable qui permet le traitement de la gestion des exceptions de base comme l'exploitation forestière, re-jeter, etc. être découplé du réel lieu de manutention. Un exemple d'un tel composant est Exception Handling Application Block de Microsoft.

Ensuite, vous pourriez vous retrouver avec un code comme ceci:

try 
{ 
    results = _client.MethodCall(input parameteres); 
    _client.Close(); 
} 
catch (Exception ex) 
{ 
    _client.CloseIfNeeded(); 
    if (!ex.Handle("Wcf.Policy")) throw; 
} 

CloseIfNeeded désigne une méthode d'extension personnalisée encapsulant la logique de fermeture du canal WCF, et la méthode d'exception Handle appelle le mécanisme de gestion des exceptions, en passant dans un nom de la politique d'exception qui doit être appliquée sur ce lieu.

Dans la plupart des cas, vous pouvez réduire exception logique de gestion à une vie décente une ou deux lignes de code, vous donnant plusieurs avantages:

  • configurabilité instantané du comportement de la gestion des exceptions (politiques)
  • extensible avec la coutume gestionnaires d'exceptions liées à des types spécifiques d'exceptions et des politiques d'exception
  • une meilleure lisibilité de gestion et code
+0

Je pense que la solution que vous avez s UGG est très bon. l'utilisation de méthodes d'extension rendra cette fonction incroyablement utile - si j'ai étendu System.ServiceModel.ClientBase avec CloseIfNeeded() pensez-vous que ce serait un bon ou un mauvais coup? – stack72

+1

Qu'en est-il de l'implémentation de 'System.ServiceModel.ICommunicationObject'? Ce serait plus conforme à l'intention architecturale de cette interface qui fournit les primitives pour la gestion de l'état de la communication. –

+0

mal donner un aller - merci :) – stack72