我们有一个包含大量属性和行为的大对象图。我们目前正在重新访问我们的域名,我们将采用DDD方法。但是我们需要您的专家建议如何为我们的大型域模型创建工厂。
我们迎合美国,加拿大,西班牙,智利,巴西,英国等多个地区。很明显,每个地区都有地址,姓名((姓氏,姓氏1,姓氏2等)),电话号码,国家身份证等。在高级别,域名模型看起来像这样
对于每个新请求,我们需要创建在正确状态下正确填充的整个对象集。我们可以使用抽象工厂模式来创建特定于地理位置的工厂,如USTransactionFactory,CanadianTransactionFactory等。
如何传入参数来创建这些对象。以地址为例
或者我们应该只有一个createAddress(地址地址)方法
只需要Address对象和
让客户创建
适当的地理特定
地址对象? E.g
SpainAddress spain =新西班牙地址();
spain.setMuniciplaityName(...);
或者我们应该为每个重要的域对象都有一个单独的AbstractFactory吗?对于例如USAddressFactory,UKAddressFactory等
是否有必要为此创建DTO?我在考虑将域传递到表示层,但通过强制执行域的只读视图来保持不变性。例如,每个域对象将实现两个接口:ReadOnlyAddress,MutableAddress。这是受到joda-time的启发。
欢迎任何其他建议和批评。
答案 0 :(得分:2)
- 我们是否应该为每个地理位置创建一个createXXXAddress(...)方法,该方法将city,state等作为输入参数?这意味着我们需要createUSAddress(...),createCanadianAddress(...),createChileanAddress(...)等
- 或者我们应该只有一个createAddress(Address addr)方法,它只接受Address对象并让客户端创建适当的地理位置特定的Address对象?
- OR我们应该为每个重要的域对象都有一个单独的AbstractFactory吗?例如USAddressFactory,UKAddressFactory等
醇>
我肯定不推荐选项1 :这会导致将客户端代码绑定到特定的地理位置,可能需要散布遍布的大量switch
/ if-else
语句每当添加/删除地理位置时,每个地方都会对代码进行更改 - 确切的问题多态性是为了解决。
我不太清楚你的选项2和3之间的确切区别,但我的第一种方法是使用某种GeographyFactory来生成部分或整个对象图强>你在这里描述。因此,客户端会调用单个createAddress
方法,但methodf本身将是多态的。
工厂是直接向客户端注入依赖项,还是在后台使用(部分)透明,类似于C ++中的语言环境取决于具体情况 - 两种方法都可以。
是否有必要为此创建DTO?我想只是将域传递给表示层,但通过强制执行域的只读视图来保持不变性。
关于地址,我会尝试仅通过不可变对象 - 如果地址发生变化,您可以创建一个新对象并丢弃旧对象。请注意,地址很少是第一类实体,而是代理值对象(即没有自己的身份)。但当然,很大程度上取决于对象 - 关系映射解决方案和数据库架构的细节。