Сохранение OperationContext.Current в переменной экземпляра экземпляра службы WCF

Я хотел знать, разумно ли хранить и ссылаться на объект OperationContext.Current в переменной экземпляра экземпляра узла службы WCF. Узел службы настроен на InstanceContextMode.PerCall, поэтому каждый новый запрос получает свой собственный экземпляр.

Причина, по которой я спрашиваю об этом, заключается в том, что WCF не гарантирует сходство потоков. Иногда WCF может запускать запрос в одном потоке и завершать запрос в другом потоке.

Объект OperationContext.Current хранится в локальном хранилище потока. Когда для той же операции используется новый поток, WCF «распространяется» на новый поток.

В этом случае, когда WCF начинает использовать другой поток, безопасно ли по-прежнему обращаться к объекту OperationContext, который был сохранен в переменной экземпляра моего экземпляра службы?


person Mohammed Ali    schedule 13.05.2012    source источник
comment
Какая польза от использования переменной экземпляра вместо OperationContext.Current?   -  person Richard Blewett    schedule 13.05.2012
comment
Мы изучаем методы внедрения зависимостей, чтобы иметь возможность модульного тестирования службы WCF.   -  person Mohammed Ali    schedule 13.05.2012


Ответы (1)


Вместо того, чтобы хранить OperationContext, оберните его в абстракцию, которую можно заменить, убедившись, что средства, представленные требуемым контекстом, находятся в абстракции - что-то вроде этого

interface IContextService
{
    Message RequestMessage{ get;}
    string SessionId{ get;}
} 

Затем создайте реализацию, использующую настоящий OperationContext.

class ContextService : IContextService
{
    public Message RequestMessage
    {
        get
        {
             return OperationContext.Current.RequestContext.RequestMessage;
        }
    }

    public string SessionId
    {
        get
        {
             return OperationContext.Current.SessionId;
        }
    }
} 

Если вы внедрите IContextService в свой класс, теперь вы можете отказаться от теста, предоставив поддельную версию.

person Richard Blewett    schedule 13.05.2012
comment
На самом деле это почти то же самое, что я делаю, за исключением того, что вместо использования OperationContext.Current я использую экземпляр OperationContext, который передается в ctor этого класса. Я предполагаю, что изменение для меня будет состоять в том, чтобы просто использовать свойство Current вместо экземпляра var. Это делает исходный вопрос неактуальным даже при использовании DI для тестов. Спасибо, что заставили меня это осознать! - person Mohammed Ali; 14.05.2012