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; }
}

这里,CarPerson只是包含一堆公共属性。然后,我的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#中"常规正确"的泛型用法吗?或者这只是掩盖了我的解决方案中更深层次的架构缺陷?我提出的解决方案中是否缺少一些东西(尽管请注意,不同GetAdd方法的实现并不像原型那样通用)?

免责声明:如果这个问题"太主观",我很抱歉,但它似乎太具体了,不适合作为程序员的理论问题。对于CodeReview.SE来说,这个问题有点太笼统了。

c#中的泛型和约定

我不认为使用泛型有什么问题,除非有人可能从。net以外的地方使用你的服务。我认为它为WSDL生成了相当丑陋的契约名称。

对于你的用例,我会说它很好。我很高兴你也从Model换成了Response。我正打算建议呢。

根据错误的使用方式,我个人倾向于为它们引发一个(聚合的)异常。不过,如果你把它用于表单验证之类的,我觉得这是可以接受的

可能我的回答也太过顺从了——但我建议在你拥有一个稳定的工作系统之前,至少在测试版中,避免创建依赖关系。尤其是当你处于开发初期的时候。同样,作为最强关系类型之一的继承,它应该尽可能长时间地放在一边。

添加基类或泛型,这看起来是一样的,你把自己放在一个非常困难的框架。

如果,比如说,有一种情况,你想出了字典或错误?或者您需要特殊的CarRequest响应代码?或者像"重定向"这样的特殊响应类型?

所以-我的建议是,你做一个特殊类型的响应每个请求,直到你发现一些响应的相似性经过大量的开发。

应该有GetCarResponseGetCar。你是否在计划应对错误?只是抛出一个异常。没有找到吗?返回null。发现?返回您找到的内容,不要为错误而烦恼。

这可能需要多写一点代码,但是您可以摆脱一些人为的限制。