这里我将会分析微软的n-layer sample 中的领域模型的设计。
1:Product 聚合,里面包含三个类:Product,Software,Book。这三者是继承关系,他们共同的一个特点就是属性的set 都private 掉了。这些类是一些基础数据类,没有什么业务,唯一的业务就是IncrementStock。
但是book,software都定义了一个private construct就很奇怪。好像是为了ef构造数据库
2: Customer 聚合,里面包含三个类:Customer,Address,Picture。其中Address类是值对象。很明显,Address的各属性值一致时,它代表的是同一个对象。Customer的各个属性跟Product类不一样,由于Customer是业务对象,需要面向业务,所以它很多属性都不是private set。有些属性根据业务需要也是需要加一些条件判断或限制时,这时需要加private set。还有就是其他聚合根对象属性一般为private set,因为这样可以限制直接修改其他聚合根对象,比如SetTheCountryReference(Guid countryId)方法就是 this.CountryId = countryId;this.Country = null; 这样就不会从Customer对象这里来修改到Country对象。
我一直很奇怪Address 对象属性是怎么保存到数据库里面去的。呵呵,这个跟它是public set也许有关。
_IsEnabled 这个成员将会maping到数据库中吗?
3: BankAccount 聚合,里面包含三个类:BankAccount,BankAccountActivity,BankAccountNumber。其中BankAccountNumber是值对象,但是这里需要注意的是 public BankAccountNumber() { }默认构造函数是public跟前面的不一样,不是很清楚这样的不一样就会影响什么?BankAccountActivity类只有一个 Guid BankAccountId,没有BankAccount对象,这说明在聚合里,各对象其实只需要有聚合根的id就可以了,根本不需要聚合根对象属性。这样也保证了只能从聚合根访问各聚合内对象,而不能从其它对象访问聚合根。
4:Order 聚合,里面包含三个类:Order ,OrderLine,ShippingInfo。ShippingInfo也是值对象。
总结:
1:需要在外部进行设置并且没有任何约束的属性才public set,否则都需要private set。
2: 实体类属性一般都private set,值对象类属性一般public set。
3: 在聚合中,一般只有聚合根对其他聚合有类属性,其他聚合类对聚合根只需要guid引用就可以了。
4:当属性值一致时表示同一对象,则该对象为值对象
浙公网安备 33010602011771号