【发布时间】: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