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

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

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

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();
            }
        }
    } 
}

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


person Didaxis    schedule 19.10.2011    source источник


Ответы (1)


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

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

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

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

i.e

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

        ((ICommunicationObject)proxy).Close();
    } 
    catch (SomeAppException)
    {
    //recover app exception
    }
}
catch (CommunicationException) 
{
    ((ICommunicationObject)proxy).Abort();
}
person Spence    schedule 19.10.2011