c# - C# 中的泛型和约定

标签 c# asp.net generics architecture

我有一个 .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; }
}

在这里,CarPerson只包含一堆公共(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# 中泛型的“常规正确”用法吗?或者这只是用我的解决方案掩盖了更深层次的架构缺陷?我提出的解决方案中是否缺少某些内容(尽管请注意,不同的 GetAdd 方法的实现并不像原型(prototype)看起来那么通用)?

免责声明:如果这个问题“过于主观”,我们深表歉意,但对于 Programmers.SE 而言,它似乎过于具体,无法成为理论问题,而对于 CodeReview.SE 而言,它似乎过于笼统。如有必要,我愿意接受有关如何改进问题的建议。

最佳答案

我认为这种泛型的使用没有问题,除非您希望有人从 .NET 以外的其他地方使用您的服务。我认为它为 WSDL 生成了非常丑陋的契约名称。

所以对于您的用例,我认为没问题。我很高兴您也从 Model 更改为 Response。我本来打算这么建议的。

根据错误的使用方式,我个人更愿意为它们提出一个(聚合的)异常。但是,如果您将它用于表单验证或其他用途,我认为这是可以接受的。

关于c# - C# 中的泛型和约定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15690087/

相关文章:

c# - 为什么具有 "where T : class"约束的 Generic<T> 方法接受接口(interface)

java - 通用返回类型 - 无法编译

java - 在java中覆盖列表结果类型

c# - 已尝试附加或添加不是新实体,可能是从另一个 DataContext 加载的

c# - ASP 文本框调用 javascript 函数

asp.net - 禁止对 IIS 7.5 或 .NET 中的某些文件使用查询参数

javascript - 如何为下拉列表框添加 'Please select...' 选项

c# - Linq - 如何聚合另一个查询的结果

c# - 杀死或关闭进程

c# - 为什么检测到正在更改的对象属性但未检测到刷新对象