使用按类型获取或按ID获取

时间:2011-04-06 17:51:02

标签: c# method-signature

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

List<Cars> GetCarsRelatedToDealership( Dealership dealership );

List<Cars> GetCarsRelatedToDealership( id dealership );

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

6 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分: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);

答案 2 :(得分:2)

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

答案 3 :(得分:1)

你能用这个方法接受一个接口吗?这将使其更加灵活,也许更容易测试。

List<Cars> GetCarsRelatedToDealership( IDealership dealership );

答案 4 :(得分:1)

我会使用Id方法,并验证Id是否有效。您可能会获得无效的经销商对象,​​在这种情况下,使用Dealership无法获得优势

答案 5 :(得分: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.
}

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