好吧,我有一个看起来像这样的界面
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,因此不提供源代码。
现在我的问题是,网络团队希望在仅存在于HTML / JS客户端的帐户页面上引入他们真正需要的Age
。
这是一个很好的解决方案,可以像{/ p>这样继承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
属性。那些将推出新房产的人也将是消费它的人。
答案 0 :(得分:0)
如果您使用personrepsitory接口,您将无法保证获得PersonWithAgeViewModel。这是接口的重点。你的保证是PersonViewModel,不能少。
您可能会考虑的另一个选择是组合 http://en.wikipedia.org/wiki/Composition_over_inheritance
你仍然没有得到年龄存在的保证,但这是让不同的团队使用相同的界面添加自己的功能的另一种方式。