2

我有一个名为GetObjectsRelatedToAType 的方法,例如GetCarsRelatedToDealership。从 Web 服务或一般方法签名的角度来看,哪种方法更好:

List<Cars> GetCarsRelatedToDealership( Dealership dealership );

或者

List<Cars> GetCarsRelatedToDealership( id dealership );

我倾向于喜欢对象方法,因为它在确保方法的源输入有效方面更有力。想法/建议?

4

6 回答 6

5

ID 是该方法运行所需的唯一信息吗?如果是这样,我会把它留在那里。

于 2011-04-06T17:54:33.523 回答
3

对象方法有问题。

Dealership dealership;
GetCarsRelatedToDealership(dealership); // dealership is null

var dealership = new Dealership();
GetCarsRelatedToDealership(dealership); // dealership has no id

在这些情况下,对象并没有给你任何优于 id 的优势。id 可能是错误的,但您可以验证它。该对象使事情变得更加复杂。

在处理服务时,我会创建一对请求/响应类。这使您可以确保您的签名永远不需要更改。您的 Request 或 Response 对象可能会更改,但方法签名不会更改。

现在我可以传递经销商 ID,以及谁在请求信息,并确保允许询问的用户查看该经销商的库存。只是通过经销商或身份证的东西是不允许的。

public class CarsRequest
{
  public int DealershipId { get; set; }
  public int RequesterId { get; set; }
}

public class CarsResponse
{
  public Car[] Cars { get; set; }
}

CarsResponse GetCarsRelatedToDealership(CarsRequest request);
于 2011-04-06T18:03:55.643 回答
2

对于网络服务,我尽量减少通过网络发送的数据量。如果您还需要一个方法,我可能会为“Dealership”类/接口创建成员方法“GetRelatedCars”。当 Web 服务调用到来时,您可以通过基于 id 获取该对象并调用对象上的“GetRelatedCars”方法来验证它是一个真正的“经销商”(并且调用者对其拥有权限)。

于 2011-04-06T18:02:16.823 回答
1

您可以让该方法采用接口吗?这将使它更加灵活,也许更容易测试。

List<Cars> GetCarsRelatedToDealership( IDealership dealership );
于 2011-04-06T17:56:21.217 回答
1

我会采用 Id 方法,并验证 Id 是否有效。您可能会得到一个无效的 Dealership 对象,在这种情况下,使用Dealership

于 2011-04-06T17:57:27.023 回答
1

通常只使用一个 ID 就足够了,而且容易得多,因为您可以简单地将一个 ID 从一个地方传递到另一个地方。这对于 Web 服务尤其重要,您希望将传输的数据量降至最低。

但是,如果您经常有较大的方法签名,其中方法名称不能很好地指定输入:

List<Cars> GetCars(int makeId, int modelId, int year, int dealershipId);

... 将错误的 ID 传递到错误的地方会变得非常容易。这就是我开始尝试寻找不同策略的地方。将您的输入强输入为域对象是一种解决方案,但与简单地使用特殊选项 POCO 相比,它通常会给您带来更多麻烦:

public class GetCarsOptions
{
    public int MakeId {get;set;}
    public int ModelId {get;set;}
    public int Year {get;set;}
    public int DealershipId {get;set;}
}

List<Cars> GetCars(GetCarsOptions options)
{
    ValidateOptions(options); // make sure the values all make sense.
}

事实是,您无法在运行时捕获所有可能的错误,因此最好将自动化测试与“快速失败”技术结合起来,尝试在编译后和部署前捕获尽可能多的错误。

于 2011-04-06T18:05:42.700 回答