8

我有一个到 .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地包含了一堆公共属性。然后,my 的每个方法都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方法的实现并不像原型看起来那样通用)?

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

4

2 回答 2

2

我认为这种使用泛型没有问题,除非您可能有人从 .NET 以外的地方使用您的服务。我认为它为 WSDL 生成了非常丑陋的合同名称。

因此,对于您的用例,我会说这很好。我很高兴你也从Model改为Response。我打算这么建议。

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

于 2013-03-28T20:01:01.823 回答
0

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

添加基类或泛型,看起来都一样,你把自己置于一个非常艰难的框架中。

比如说,如果您遇到字典或错误的情况怎么办?或者您需要对 CarRequest 的特殊响应代码?还是像“重定向”这样的特殊响应类型?

所以 - 我的建议是,你对每个请求做出一种特殊的响应,直到在大量开发之后发现一些响应相似之处。

应该有的GetCarResponseGetCar您是否计划在响应中出现错误?只是抛出一个异常。未找到?返回空值。成立?返回您发现的内容,不要为错误而烦恼。

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

于 2013-04-01T21:09:46.960 回答