【发布时间】:2014-02-02 09:05:14
【问题描述】:
我希望你能帮助解决我与同事之间的轻微分歧。
我一直认为对象应该保护其内部状态并且只公开暴露外部世界需要访问或更改的内容是面向对象设计的原则。在富域模型的上下文中,这意味着域对象应该强制它们所代表的模型的有效性,并且它们不应该允许外部调用者使它们的状态无效,即使它们是核心域对象而不是直接调用暴露在外面的世界。
以 Thing 类型的对象为例,它具有一组属性。我的同事提出了以下建议。
public class Thing
{
public List<ThingProperty> Properties { get; set; }
}
我不喜欢这个,因为它允许外部调用者将属性引用设置为空。他的辩护是,如果没有这个可变引用,就很难将数据从数据访问加载到模型中,或者从表示层映射到核心模型。
我的解决方法如下...
public class Thing
{
private readonly List<ThingProperty> properties;
public Thing() { properties = new List<ThingProperty>(); }
public ReadOnlyCollection<ThingProperty> { get { return properties.AsReadOnly(); } }
public void AddProperty(ThingProperty add) { (validate) properties.Add(add); }
}
这意味着在向事物添加属性时可能需要的任何验证都可以在模型内部进行验证(例如,如果只添加给定属性类型的 1 个实例)并且模型始终确保有效状态。缺点是很难从数据访问或表示模型映射到这种形式,但我认为这是值得付出的代价。
有什么想法吗?谢谢。
【问题讨论】:
-
如果域模型是您关心的问题,那么您的方法就是正确的方法。至于其他层,您之间只有单独的模型和映射。