Ссылочный тип, передаваемый ref другому методу, не возвращается с обновленными значениями - PullRequest
1 голос
/ 28 октября 2011

Я сталкиваюсь со следующей проблемой:

Мне нужно сделать вызов с моего контроллера на мой уровень домена; который вызывает метод веб-службы, который принимает запрос по ссылке (ref).

Код контроллера:

//BusinessEntityObject is a Reference-Type (BusinessEntity) object
var request = View.BusinessEntityObject; 
_workflowService.PerformAction(request);
if(request.Errors.Count != 0)
{
    View.Errors = request.Errors;
    return false;
}

Уровень домена (класс WorkflowService.cs):

public void PerformAction(BusinessEntity request)
{
    //TryAction(System.Action action) basically wraps action in try catch and handles exceptions 
    TryAction(() =>
             {
                 _wcfClient.RequestSomething(ref request);
             });
}

IF _wcfClient.RequestSomething изменяет коллекцию ошибок по возвращении, объект запроса имеет эту обновленную коллекцию ошибок. Однако, как только управление возвращается контроллеру и проверяется коллекция ошибок, мои обновления исчезают.

Edit00: ооо и бесстыдный плагин, я нахожусь на 14 репутации, и я пытался поднять кучу вопросов / ответов, которые были полезны для меня, и он говорит, что я не могу, потому что мой уровень низкий.

Edit01: Большое спасибо, Дилан, всегда приятно иметь такой сайт, чтобы указывать на очень маленькие вещи, которые можно упустить. Обновленный код, который вернул мне значение, выглядит следующим образом:

Уровень домена (класс WorkflowService.cs):

public BusinessEntity PerformAction(BusinessEntity request)
{
    //TryAction(System.Action action) basically wraps action in try catch and handles exceptions 
    TryAction(() =>
             {
                 _wcfClient.RequestSomething(ref request);
                 return request;
             });
}

Ответы [ 2 ]

3 голосов
/ 28 октября 2011

Когда вы передаете объект службе WCF, он сериализуется, отправляется по сети, а затем десериализуется на сервере. Передача «по ссылке» ничего не меняет в этом случае, если сервер вносит в него изменения, он не будет отправлен обратно вызывающей стороне. Только возвращаемое значение вызова WCF сериализуется и отправляется обратно.

Я бы предложил, если вам нужна служба WCF для возврата любых данных, которые вы упаковали в возвращаемое значение.

0 голосов
/ 28 октября 2011

В вашем методе PerformAction отсутствует модификатор ref.

public void PerformAction(ref BusinessEntity request)
{
    TryAction(() => _wcfClient.RequestSomething(ref request));
}

Однако внесение этого изменения предотвратит компиляцию вашего кода. Вы получите следующую ошибку:

Невозможно использовать параметр ref или out 'request' внутри анонимного метода, лямбда-выражение или запросное выражение

Вам нужно будет сделать что-то подобное, чтобы это заработало:

public void PerformAction(ref BusinessEntity request)
{
    var r = request;
    TryAction(() => _wcfClient.RequestSomething(ref r));
    request = r;
}

В целом, кажется, что это немного странно, передавая запрос по ссылке. Было бы лучше вернуть новый (или тот же) экземпляр и выполнить назначение на внешнем уровне.

...