What is the best workaround for the WCF client `using` block issue?

前端 未结 26 2104
余生分开走
余生分开走 2020-11-22 00:03

I like instantiating my WCF service clients within a using block as it\'s pretty much the standard way to use resources that implement IDisposable:

26条回答
  •  野的像风
    2020-11-22 00:21

    For those interested, here's a VB.NET translation of the accepted answer (below). I've refined it a bit for brevity, combining some of the tips by others in this thread.

    I admit it's off-topic for the originating tags (C#), but as I wasn't able to find a VB.NET version of this fine solution I assume that others will be looking as well. The Lambda translation can be a bit tricky, so I'd like to save someone the trouble.

    Note that this particular implementation provides the ability to configure the ServiceEndpoint at runtime.


    Code:

    Namespace Service
      Public NotInheritable Class Disposable(Of T)
        Public Shared ChannelFactory As New ChannelFactory(Of T)(Service)
    
        Public Shared Sub Use(Execute As Action(Of T))
          Dim oProxy As IClientChannel
    
          oProxy = ChannelFactory.CreateChannel
    
          Try
            Execute(oProxy)
            oProxy.Close()
    
          Catch
            oProxy.Abort()
            Throw
    
          End Try
        End Sub
    
    
    
        Public Shared Function Use(Of TResult)(Execute As Func(Of T, TResult)) As TResult
          Dim oProxy As IClientChannel
    
          oProxy = ChannelFactory.CreateChannel
    
          Try
            Use = Execute(oProxy)
            oProxy.Close()
    
          Catch
            oProxy.Abort()
            Throw
    
          End Try
        End Function
    
    
    
        Public Shared ReadOnly Property Service As ServiceEndpoint
          Get
            Return New ServiceEndpoint(
              ContractDescription.GetContract(
                GetType(T),
                GetType(Action(Of T))),
              New BasicHttpBinding,
              New EndpointAddress(Utils.WcfUri.ToString))
          End Get
        End Property
      End Class
    End Namespace
    

    Usage:

    Public ReadOnly Property Jobs As List(Of Service.Job)
      Get
        Disposable(Of IService).Use(Sub(Client) Jobs = Client.GetJobs(Me.Status))
      End Get
    End Property
    
    Public ReadOnly Property Jobs As List(Of Service.Job)
      Get
        Return Disposable(Of IService).Use(Function(Client) Client.GetJobs(Me.Status))
      End Get
    End Property
    

提交回复
热议问题