8
votes

Service.close () vs Service.Abort () - Exemple de WCF

Dans l'un des didacticiels de la WCF, j'ai vu le code d'échantillon suivant: xxx

est le moyen correct de garantir que les ressources (c.-à-d. Les connexions) sont libérées, même sous conditions d'erreur?


0 commentaires

4 Réponses :


4
votes

J'ai eu bonne chance avec ce modèle:

Dim service As New MyService()
Dim closed As Boolean = False
Try
    service.Open()
    If Not service.State = ServiceModel.CommunicationState.Opened Then
        ''Handle a not-opened state here
    End If
    service.MyMethod()
    service.Close()
    closed = true
Catch ex As Exception
    ''Handle errors here
Finally
    If Not closed Then
        service.Abort()
    End If
End Try
service = Nothing


0 commentaires

2
votes

Vous avez l'idée générale correcte. J'ai utilisé la méthode de prolongation suivante pour conserver au minimum les lignes de code répétitif. xxx

exemple de code à l'aide de cette méthode d'extension: xxx

bien sûr c'est c #, mais je pense que cela devrait toujours être utile.


0 commentaires

15
votes

Voir indisposable: WCF GOTCHA # 1 * sup>, où il propose une méthode d'emballage pratique: xxx pré>

utilisation: p>

Service<IOrderService>.Use(
    orderService =>
        {
            orderService.PlaceOrder(request);
        });


2 commentaires

J'aime votre solution, mais en avez-vous un, qui peut être utilisé avec une injection de dépendance. Étant donné qu'un service est une dépendance, je ne veux pas exécuter mon test contre elle.


Ce n'est pas ma solution. Dans tous les cas, je m'attends à ce que vous puissiez créer un Service non statique et injecter le canalysory ou le iCLientChannel .



0
votes

Si vous utilisez un cache côté client, vous pourriez envisager d'utiliser des arbres d'expression (voir http://thegrenade.blogspot.com/2009/07/USTION-XPRESSIVE-TREES-FOR-MORE-ELEGANT.HTML ):

Product p = GetItem((client, identifier) => client.GetProduct(identifier), new CatalogServiceClient(), 123);


3 commentaires

Rob, je ne vois pas comment votre réponse s'applique à cette question.


Peut-être que l'exemple de méthode que j'ai donné est un peu trop spécifique pour une enveloppe d'appel de service générique. En réalité, vous avez besoin de surcharges de méthodes pour des méthodes de service qui prennent plus d'un paramètre et cet exemple ne va pas dans ce détail. Cependant, de nombreuses solutions WCF contiennent des groupes de méthodes très similaires qui renvoient simplement des types différents en réponse à un paramètre ID avec un paramètre d'identification. Et vous avez raison que mon dernier bloc manque également un essai imbriqué / enfin pour l'avortement.


Je pense que vous devrez peut-être lire la question de nouveau. Votre réponse ne résout pas la question de quelque manière que ce soit.