Использование прокси WCF - PullRequest
       6

Использование прокси WCF

2 голосов
/ 20 октября 2011

Этот ответ был опубликован в ответ на этот вопрос .

Сейчас он немного выше моей головы, но "функция более высокого порядка" должнаиспользоваться в клиентском прокси-классе?Это правильное использование?:

public class MyProxy
{
    readonly IMyService service =
        new ChannelFactory<IMyService>("IMyService").CreateChannel();

    public ResponseObject Foo(RequestObject request)
    {
        return UseService((IMyService service) =>
            service.Bar(request));
    }

    T UseService<T>(Func<IIssueTrackerService, T> code)
    {
        bool error = true;

        try
        {
            T result = code(issueTrackerChannel);
            ((IClientChannel)issueTrackerChannel).Close();
            error = false;
            return result;
        }
        finally
        {
            if (error)
            {
                ((IClientChannel)issueTrackerChannel).Abort();
            }
        }
    } 
}

Все, что я действительно ищу, - это некоторые указания и правильный способ сделать это.

1 Ответ

1 голос
/ 20 октября 2011

Это на самом деле неплохо.Возможно, вы можете использовать ICommunicationObject вместо этого, поскольку тот же код требуется и для ваших хостов.

Способ думать об этом - дружеский вызов.Пожалуйста, завершите мой звонок и верните прокси в пул соединений.Прервите: «Мне все равно, закройте прокси, потому что он мертв, а также удалите его из пула, потому что он мертв».

В зависимости от вашего кода, вы можете абстрагировать части кода «WCF Proxy» от частей вызова функции, если это возможно.Таким образом, вы можете тестировать логику приложения отдельно от прокси-кода WCF.

Возможно, вы захотите посмотреть на попытку {} catch (CommunicationException), чтобы вы могли обрабатывать исключения WCF отдельно и для исключения уровня приложения.вместо окончательно.

т.е.

try 
{
    try 
    {
        proxy.call();
        //app logic

        ((ICommunicationObject)proxy).Close();
    } 
    catch (SomeAppException)
    {
    //recover app exception
    }
}
catch (CommunicationException) 
{
    ((ICommunicationObject)proxy).Abort();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...