我有一个名为GetObjectsRelatedToAType的方法,例如GetCarsRelatedToDealership。从Web服务或一般方法签名的角度来看,哪种方法更好:
List<Cars> GetCarsRelatedToDealership( Dealership dealership );
或
List<Cars> GetCarsRelatedToDealership( id dealership );
我倾向于喜欢对象方法,因为确保方法的源输入有效会更有力。想法/建议?
答案 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.
}
事实是,您将无法在运行时捕获所有可能的错误,因此将自动化测试与“快速失败”技术相结合以尝试在编译后捕获尽可能多的错误是个好主意。在部署之前。