c#中的泛型和约定
本文关键字:约定 泛型 | 更新日期: 2023-09-27 18:06:27
我有一个到。net服务层的接口,该接口将通过web服务与第三方系统通信。这将处理与第三方系统功能相关的许多不同任务(它实际上是一个定制的CRM系统,但由于上下文不相关,我将把它替换为一些无关紧要的内容)。
接口看起来像这样:
public interface IMyService
{
CarModel GetCar(string registration);
CarModel AddCar(Car car);
PersonModel GetPerson(string personId);
PersonModel AddPerson(Person person);
}
现在,我的模型目前工作如下:我有一个BaseResponseModel
,每个SomethingModel
继承。每个SomethingModel
都包含一些基本属性,并且还包含一个Something
-,如:
基本响应模型
public class BaseResponseModel
{
public List<string> Errors { get; set; }
public bool HasErrors
{
get
{
return (Errors != null && Errors.Count > 0);
}
}
}
特定响应模型
public class CarModel : BaseResponseModel
{
public Car Car { get; set; }
}
public class PersonModel : BaseResponseModel
{
public Person Person { get; set; }
}
这里,Car
和Person
只是包含一堆公共属性。然后,我的IMyService
的每个方法接受它的参数,格式化对.asmx web服务的请求,将响应解析为它的响应模型,并将其返回给调用者(一个.ascx后面的代码)。
然而,不同...Model
类的数量(更不用说它们的包装对象都有不同的属性名称)正在变得丑陋。我的想法是按照以下思路做一些事情:
public class Car
{
public string Registration { get; set; }
}
public class ServiceResponse<T>
{
public List<string> Errors { get; set; }
public bool HasErrors { ... }
public T Result { get; set; }
}
public interface IMyService
{
ServiceResponse<Car> GetCar(string registration);
ServiceResponse<Car> AddCar(Car car);
ServiceResponse<Person> GetPerson(string id);
ServiceResponse<Person> AddPerson(Person person);
}
我的ASP。. NET控件将从IMyService
中的每个方法接收ServiceResponse<T>
。
这是c#中"常规正确"的泛型用法吗?或者这只是掩盖了我的解决方案中更深层次的架构缺陷?我提出的解决方案中是否缺少一些东西(尽管请注意,不同Get
和Add
方法的实现并不像原型那样通用)?
免责声明:如果这个问题"太主观",我很抱歉,但它似乎太具体了,不适合作为程序员的理论问题。对于CodeReview.SE来说,这个问题有点太笼统了。
我不认为使用泛型有什么问题,除非有人可能从。net以外的地方使用你的服务。我认为它为WSDL生成了相当丑陋的契约名称。
对于你的用例,我会说它很好。我很高兴你也从Model
换成了Response
。我正打算建议呢。
根据错误的使用方式,我个人倾向于为它们引发一个(聚合的)异常。不过,如果你把它用于表单验证之类的,我觉得这是可以接受的
可能我的回答也太过顺从了——但我建议在你拥有一个稳定的工作系统之前,至少在测试版中,避免创建依赖关系。尤其是当你处于开发初期的时候。同样,作为最强关系类型之一的继承,它应该尽可能长时间地放在一边。
添加基类或泛型,这看起来是一样的,你把自己放在一个非常困难的框架。
如果,比如说,有一种情况,你想出了字典或错误?或者您需要特殊的CarRequest响应代码?或者像"重定向"这样的特殊响应类型?
所以-我的建议是,你做一个特殊类型的响应每个请求,直到你发现一些响应的相似性经过大量的开发。
应该有GetCarResponse
到GetCar
。你是否在计划应对错误?只是抛出一个异常。没有找到吗?返回null。发现?返回您找到的内容,不要为错误而烦恼。
这可能需要多写一点代码,但是您可以摆脱一些人为的限制。