2

我创建了一个简单的 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);

我在这里有两个问题:

  1. 我应该将原始变量传递给服务方法还是应该将它们全部包装在一个类中(即 SiteSearchDTO)。为什么请详细说明。

  2. 我的第二个问题是当我在项目中添加对服务的引用时,我会在那里生成相应的方法。但在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 是倒数第二个变量。为什么?

4

2 回答 2

2

要回答您的第一个问题,有许多不同的意见,但是,我认为Robert Martin 的意见是最好的

函数的理想参数数量为零(niladic)。接下来是一个(单子),紧随其后的是两个(二元)。应尽可能避免使用三个参数(三元)。超过三个(多元)需要非常特殊的理由——然后无论如何都不应该使用。

但是,要回答为什么,这很简单。您没有封装所有这些参数。只看列表,很明显除了可能和pageNo之外的所有内容都是相关的,因此它们应该封装在一个类/结构中以反映它们彼此相关,即使只是作为一个分组。pageSizex

假设这些都放在一个类型中,那么你就有了一个参数的函数,封装性很好,这样整体管理起来更容易。

对于您的第二个问题,我怀疑您的代理及其生成的服务/方法不同步。svcutil.exe 工具(生成您的代理)尊重参数的顺序。如果您的情况并非如此(这意味着您验证了您的代理代码和服务器代码没有不同步),那么您发现了一个错误(但我会先重新生成代理进行仔细检查)。

于 2012-06-24T13:31:31.890 回答
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.
于 2012-06-24T13:26:45.777 回答