我创建了一个简单的WCF服务。我正在编写一种方法来根据某些搜索条件搜索某个实体。
[OperationContract]
List<SiteDTO> GetList(int? siteID, string code, string name,
string notes, byte? status, string description,
int? modifiedBy, DateTime? modifiedDate, long?
timeStamp, int? pageNo, int? pageSize, out int?
totalRows, int x);
我在这里有两个问题:
我应该将原始变量传递给服务方法,还是应该将它们全部包装在一个类中(即SiteSearchDTO)。和为什么?请详细说明。
我的第二个问题是当我在项目中添加对服务的引用时,我得到了相应的方法。但在Reference.cs
中有不同的签名。
public System.Collections.Generic.List<RPMS.Web.SiteService.SiteDTO>
GetList(out System.Nullable<int> totalRows,
System.Nullable<int> siteID, string code, string name,
string notes, System.Nullable<byte> status, string description,
System.Nullable<int> modifiedBy,
System.Nullable<System.DateTime> modifiedDate,
System.Nullable<long> timeStamp,
System.Nullable<int> pageNo,
System.Nullable<int> pageSize, int x)
问题是生成的方法有 int? totalRows 作为第一个参数,但在原始服务方法中,totalRows是倒数第二个变量。的为什么吗
答案 0 :(得分:2)
要回答您的第一个问题,there's a number of differing opinions,我认为the one from Robert Martin is the best:
函数的理想参数数量为零(niladic)。下一个 一个(monadic),紧随其后的是两个(二元)。三个论点 (三元组)应尽可能避免。超过三个(polyadic) 需要非常特殊的理由 - 然后不应该使用 反正。
回答为什么,但是,这很简单。你没有encapsulation拥有所有这些参数。只是查看列表,很明显除了pageNo
,pageSize
和x
之外的所有内容都是相关的,因此它们应该封装在类/结构中以反映它们与每个相关其他,即使只是作为一个分组。
假设这些都被放入一个类型中,那么你有一个带有单参数的函数,并且具有良好的封装,这使得整体管理变得更容易。
对于您的第二个问题,我怀疑您的代理及其生成的服务/方法不同步。 svcutil.exe tool(生成代理)尊重参数的顺序。如果你有一个没有它的情况(意味着你验证了你的代理代码和服务器代码没有不同步),那么你发现了一个错误(但我先通过重新生成代理来仔细检查)。
答案 1 :(得分:0)
对于第一个问题,这取决于您的架构和技术选择
- The problem when you pass entity, you create dependance on your entity library, and you contraign your client to reference it, your layer become depend of entity layer.
2. For the second question proxy class is generated by basing on meta data of your wsdl, check your wsdl of your web service.