Пример подписи целевого метода: Public Function DnaService(url As String) As EndpointAddress
Пример сигнатуры целевого метода: Public Function DnaService(url As String) As EndpointAddress
код>
Код: Выделить всё
your textЯ пытаюсь построить выражение так, чтобы функция уже имела значение входного параметра. Кажется, что это должно быть легко сделать, но я не могу решить эту проблему.
Выражение параметра: Dim urlParameterExpression As ParameterExpression = Expression. Параметр(GetType(String), "url")
Как создать выражение параметра с уже определенным значением для использования в функции, описанной выше.
Можно ли определить выражение параметра с включенным значением? Если да, то как я могу это сделать?
Чтобы добавить дополнительную информацию. Конечным результатом является наличие централизованного класса для вызова служб wcf. Это существующее приложение, которое очень старое... Приложение представляет собой приложение Winforms, оно имеет множество ссылок на службы. Каждая ссылка на службу имеет класс контроллера, который по сути является оберткой для методов клиента службы. На самом деле это просто транзит: каждый метод контроллера имеет ту же сигнатуру, что и операция службы, которую он намеревается вызвать. Я пытаюсь заменить необходимость создания этих классов контроллеров, а также иметь возможность использовать существующие вспомогательные методы, используемые для инициализации каждого клиента службы.
Сигнатура класса: Открытый класс ServiceController(TService As Class, TServiceClient As ServiceModel.ClientBase(Of TService))
Метод вызова:
Код: Выделить всё
Public Function Invoke(Of TResponse As Class)(serviceMethod As Expression(Of Func(Of TServiceClient, TResponse)), Optional callingMemberName As String = Nothing) As TResponse
Dim serviceOperationName As String = "Unknown"
Try
Dim serviceMethodCall As MethodCallExpression = serviceMethod.Body
If (serviceMethodCall IsNot Nothing) Then
serviceOperationName = serviceMethodCall.Method.Name
Using serviceClient As TServiceClient = Me.GetServiceClient()
Return serviceMethod.Compile()(serviceClient)
End Using
Else
Throw New ArgumentOutOfRangeException(NameOf(serviceMethod), $"Invoke parameter: {NameOf(serviceMethod)} must be a method call.")
End If
Catch ex As Exception
_logger.Error($"A {ex.GetBaseException().GetType().Name} occurred while calling {GetType(TService).Name} operation: {serviceOperationName} from {callingMemberName}.", ex)
Throw
End Try
End Function
Метод получения клиента службы:
Код: Выделить всё
Private Function GetServiceClient() As TServiceClient
Dim serviceClient As TServiceClient = Nothing
Dim serviceClientType As Type = GetType(TServiceClient)
Dim endpointAddress As ServiceModel.EndpointAddress = Nothing
Dim getEndpointAddress As Func(Of ServiceModel.EndpointAddress) = Nothing
If (_endpointLookup _
.TryGetValue(serviceClientType, getEndpointAddress)) Then
serviceClient = Activator.CreateInstance(serviceClientType _
, SessionManager.Instance.URLManager.CreateBinding() _
, getEndpointAddress())
SessionManager.Instance.URLManager.ApplyOperationBehavior(serviceClient.Endpoint)
SessionManager.Instance.ApplyCredentials(serviceClient.ClientCredentials)
serviceClient.ChannelFactory.Endpoint.EndpointBehaviors.Add(New MspServiceRequestHeaderBehavior())
End If
Return serviceClient
End Function
Код: Выделить всё
return new ServiceController()
.Invoke((vinService) => vinService.DecodeVin(vehicleIdentificationNumber));
Заранее спасибо,
Патрик
Я пытался найти решение своей проблемы через Google и, конечно же, StackOverflow, но так и не нашел ответа. Возможно, я просто ввожу правильные условия поиска в Google?
Подробнее здесь: https://stackoverflow.com/questions/790 ... address-ex