2011-10-28 33 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); 
      }); 
} 

IF _wcfClient.RequestSomething一旦返回修改Errors集合的请求对象具有更新这个错误的错误采集。但是,一旦控制返回到控制器&错误收集被检查,然后我的更新消失。

Edit00:ohh和无耻的插头,我在代表14,我试图碰到一堆对我有用的问题/答案,它说我不能因为我的水平低。

Edit01:非常感谢Dylan,看到总有这样的网站指出可能会错过的非常小的事情。返回的值给我更新的代码如下:

领域层(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服务是系列化,发送穿过电线,然后在服务器上反序列化。在这种情况下,“通过参考”传递它不会改变任何内容,如果服务器对其进行了更改,它将不会被发回给调用者。只有WCF调用的返回值被序列化并返回。

我会建议,如果你需要WCF服务返回任何数据,你把它打包到返回值。

+0

另一端的WCF服务是Windows Workflow Foundation 4工作流程。当我们导入服务端点时,它生成的客户端类将其设置为方法签名。这发生在工作流中,因为输入类型(BusinessEntity对象)和它的返回类型(BusinessEnity对象)是相同的。我们希望它能像你说的那样返回修改过的对象,但这就是我们为wcf创建客户端类的方式。工作流程是我们无法控制的事情(希望事实并非如此)。 – Neomoon

+0

如果您想从WCF方法中接收数据(例如,您希望他们使用更新的错误集合返回BusinessEntity),则必须将其作为服务方法的返回值(看起来像您的方法现在全部返回void)返回。 –

+0

换句话说,如果工作流程不是您可以更改的东西,并且它没有任何返回值,那么您无法从中获取任何数据。 –

0

您在PerformAction方法中缺少ref修饰符。

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

但是,进行此更改将会阻止您的代码进行编译。您会收到以下错误:

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

你必须做这样的事情,使其工作:

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

所有了,似乎有点古怪通过引用传递的请求。返回一个新的(或相同的)实例并在外层做一个任务会更好。

相关问题