2011-10-28 6 views
1

に戻りません:参照タイプは、私は次の問題に直面しています更新された値

私は自分のドメイン層に私のコントローラからの呼び出しを行う必要があります。このメソッドは、参照(ref)で要求を受け取るWebサービスメソッドを呼び出します。

コントローラーコード:

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

_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; 
      }); 
} 
+0

ドメインレイヤーがBusinessEntityObject内の何かを変更しないように設計されています。適切な場合には例外が発生する可能性があります。 – mozillanerd

答えて

3

あなたはそれがシリアル化されるWCFサービスへの上にオブジェクトを渡し、送信され、次のように私には値を返され、更新されたコードが見えますその後、サーバー上でデシリアライズされます。 "refで"これを渡しても、この場合は何も変更されません。サーバーが変更を行った場合、呼び出し元には戻されません。 WCF呼び出しの戻り値のみがシリアル化され、返送されます。

データを返すためにWCFサービスが必要な場合は、戻り値にパッケージ化することをお勧めします。

+0

もう一方の側のWCFサービスは、Windows Workflow Foundation 4ワークフローです。サービスエンドポイントをインポートすると、生成されたクライアントクラスによってメソッドシグネチャが設定されます。これは、ワークフローで入力タイプ(BusinessEntityオブジェクト)とその戻りタイプ(BusinessEnityオブジェクト)が同じであるために発生します。あなたが言ったように、変更されたオブジェクトを返すことを望みますが、それはwcfのクライアントクラスがどのように作成されるかです。ワークフローは、私たちが制御できないものです(そうでないことを望みます)。 – Neomoon

+0

WCFメソッドからデータを受信したい場合(たとえば、エラーコレクションを更新してBusinessEntityを返すようにする場合)、サービスメソッドの戻り値として返す必要があります。 –

+0

つまり、ワークフローが変更可能なものではなく、戻り値がない場合、ワークフローからデータを取得することはできません。 –

0

PerformActionメソッドにref修飾語がありません。

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

ただし、この変更を加えるとコードがコンパイルされなくなります。すべてのアップ

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

それは、参照することにより、要求を渡すビットフレーク状思わ:あなたはそれを動作させるために、このような何かを行う必要があるでしょう

Cannot use ref or out parameter 'request' inside an anonymous method, lambda expression, or query expression

:次のエラーを取得します。新しい(または同じ)インスタンスを返し、外部レベルで代入を行う方がよいでしょう。

関連する問題