我面临以下问题:
我需要从我的控制器拨打我的域层;它调用通过引用(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:哦,无耻的插件,我在14号代表,我试图提出一些对我有用的问题/答案,它说我不能因为我的水平很低。< / p>
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 :(得分:3)
当您将对象传递给WCF服务时,它会被序列化,通过网络发送,然后在服务器上反序列化。在这种情况下,“通过引用”传递它不会改变任何内容,如果服务器对其进行更改,则不会将其发送回调用者。只有WCF调用的返回值被序列化并发回。
我建议,如果你需要WCF服务来返回任何数据,你将它打包成返回值。
答案 1 :(得分:0)
您的ref
方法错过了PerformAction
修饰符。
public void PerformAction(ref BusinessEntity request)
{
TryAction(() => _wcfClient.RequestSomething(ref request));
}
但是,进行此更改将阻止您的代码编译。您将收到以下错误:
无法在匿名方法中使用ref或out参数'request', lambda表达式或查询表达式
你必须做这样的事情才能让它发挥作用:
public void PerformAction(ref BusinessEntity request)
{
var r = request;
TryAction(() => _wcfClient.RequestSomething(ref r));
request = r;
}
通过引用传递请求似乎有点不稳定。最好返回一个新的(或相同的)实例并在外层执行赋值。