我有一个 .NET 服务层的接口(interface),该接口(interface)将通过 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
只包含一堆公共(public)属性。然后,我的每个方法 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 控件将收到 ServiceResponse<T>
来自 IMyService
中的每个方法.
这是 C# 中泛型的“常规正确”用法吗?或者这只是用我的解决方案掩盖了更深层次的架构缺陷?我提出的解决方案中是否缺少某些内容(尽管请注意,不同的 Get
和 Add
方法的实现并不像原型(prototype)看起来那么通用)?
免责声明:如果这个问题“过于主观”,我们深表歉意,但对于 Programmers.SE 而言,它似乎过于具体,无法成为理论问题,而对于 CodeReview.SE 而言,它似乎过于笼统。如有必要,我愿意接受有关如何改进问题的建议。
最佳答案
我认为这种泛型的使用没有问题,除非您希望有人从 .NET 以外的其他地方使用您的服务。我认为它为 WSDL 生成了非常丑陋的契约名称。
所以对于您的用例,我认为没问题。我很高兴您也从 Model
更改为 Response
。我本来打算这么建议的。
根据错误的使用方式,我个人更愿意为它们提出一个(聚合的)异常。但是,如果您将它用于表单验证或其他用途,我认为这是可以接受的。
关于c# - C# 中的泛型和约定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15690087/