【问题标题】:Subclass a View Model and add extra property子类化视图模型并添加额外的属性
【发布时间】:2014-05-16 14:03:26
【问题描述】:

好的,我有一个看起来像这样的界面

public interface PersonRepository {
    PersonViewModel GetByName(string name);
}

PersonViewModel 很简单,看起来像这样

public class PersonViewModel {
    public string FullName { get; set; }
}

此应用程序的上下文是我们托管一个 ASP.NET MVC 站点,该站点充当网站 (JS/HTML) 和一些 Obj-C 和 Java 客户端的端点。它将数据公开为 JSON。

我们想要实现的是,我们的分布式团队知道他们对服务的最低期望。但我们也希望能够灵活地添加内容而不会互相破坏。

因此,视图模型和界面由提供所需公共对象的核心团队所有。他们将这些通用对象作为 DLL 分发,因此不提供源代码。

现在我的问题是,网络团队想要引入Age,因为他们确实需要在仅存在于 HTML/JS 客户端中的帐户页面上。

像这样子类化PersonViewModel 是否是一个很好的解决方案

public class PersonWithAgeViewModel : PersonViewModel {
    public int Age { get; set; }
}

在存储库的实现中,它需要看起来像这样

 public class PersonWithAgeFromDBRepository : PersonRepository
{
    public PersonViewModel GetByName(string name)
    {
        //.. Get data from DB
        var person = new PersonWithAgeViewModel(){ Age = 13, FullName = "Hello World"};
        return (PersonViewModel)person; // Cast to person view model
    }
}

当然,我需要设置站点以使用我们的新存储库。

我不确定的是,我觉得我在滥用接口和 PersonViewModel 类型,只是为了充当另一种类型的传输机制。 它将起作用,因为我将在 JSON 中正确序列化数据,并且我的客户可以使用它。但这是解决问题的好主意吗?

我会想念的是,没有任何东西可以保证客户这个Age 属性存在。引入新资产的人也将成为消费它的人。

【问题讨论】:

  • 您是否可以在您的界面中返回PersonViewModelWithAge,这样您就不需要强制转换了。如果我理解您的问题,您不确定是否已过年龄?
  • 不,我无法更改界面。其实我不需要投射,我只是想突出它。

标签: c# .net asp.net-mvc design-patterns


【解决方案1】:

如果您使用 personrepsitory 接口,您将永远无法保证获得 PersonWithAgeViewModel。这就是拥有那个界面的意义所在。您的保证是 PersonViewModel 不多不少。

您可能会考虑的另一种选择是组合 http://en.wikipedia.org/wiki/Composition_over_inheritance

您仍然无法保证存在年龄,但这是让不同团队使用相同界面添加自己的功能的另一种方式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-13
    • 2016-05-17
    • 1970-01-01
    • 1970-01-01
    • 2021-01-05
    • 1970-01-01
    相关资源
    最近更新 更多