关于为大域对象创建工厂的建议

时间:2011-01-03 17:44:12

标签: design-patterns architecture domain-driven-design

我们有一个包含大量属性和行为的大对象图。我们目前正在重新访问我们的域名,我们将采用DDD方法。但是我们需要您的专家建议如何为我们的大型域模型创建工厂。

问题

我们迎合美国,加拿大,西班牙,智利,巴西,英国等多个地区。很明显,每个地区都有地址,姓名((姓氏,姓氏1,姓氏2等)),电话号码,国家身份证等。在高级别,域名模型看起来像这样

  1. 一个交易可以有多个 主题
  2. 主题有姓名, 地址,TelephoneNumber,NationalID
  3. 主题可以是ConsumerSubject     或者是BusinessSubject
  4. ConsumerSubject有一个PersonName     而BusinessSubject有一个     BUSINESSNAME
  5. 地址可以是     USAddress,UKAddress,     CanadianAddress,ChileAddress等     和可能的方式相同     地理特定的子类     大多数域对象(其中     适用)
  6. 对于每个新请求,我们需要创建在正确状态下正确填充的整个对象集。我们可以使用抽象工厂模式来创建特定于地理位置的工厂,如USTransactionFactory,CanadianTransactionFactory等。

    此处需要建议

    如何传入参数来创建这些对象。以地址为例

    1. 我们应该有一个createXXXAddress(...)方法吗? 每个城市的地理位置, state等作为输入参数?这个 意味着我们需要拥有 createUSAddress(...) createCanadianAddress(...) createChileanAddress(...)etc
    2. 或者我们应该只有一个createAddress(地址地址)方法 只需要Address对象和 让客户创建 适当的地理特定 地址对象? E.g
      SpainAddress spain =新西班牙地址(); spain.setMuniciplaityName(...);

    3. 或者我们应该为每个重要的域对象都有一个单独的AbstractFactory吗?对于例如USAddressFactory,UKAddressFactory等

    4. 此处需要建议

      是否有必要为此创建DTO?我在考虑将域传递到表示层,但通过强制执行域的只读视图来保持不变性。例如,每个域对象将实现两个接口:ReadOnlyAddress,MutableAddress。这是受到joda-time的启发。

      欢迎任何其他建议和批评。

1 个答案:

答案 0 :(得分:2)

  
      
  1. 我们是否应该为每个地理位置创建一个createXXXAddress(...)方法,该方法将city,state等作为输入参数?这意味着我们需要createUSAddress(...),createCanadianAddress(...),createChileanAddress(...)等
  2.   
  3. 或者我们应该只有一个createAddress(Address addr)方法,它只接受Address对象并让客户端创建适当的地理位置特定的Address对象?
  4.   
  5. OR我们应该为每个重要的域对象都有一个单独的AbstractFactory吗?例如USAddressFactory,UKAddressFactory等
  6.   

我肯定不推荐选项1 :这会导致将客户端代码绑定到特定的地理位置,可能需要散布遍布的大量switch / if-else语句每当添加/删除地理位置时,每个地方都会对代码进行更改 - 确切的问题多态性是为了解决

我不太清楚你的选项2和3之间的确切区别,但我的第一种方法是使用某种GeographyFactory来生成部分或整个对象图你在这里描述。因此,客户端会调用单个createAddress方法,但methodf本身将是多态的。

工厂是直接向客户端注入依赖项,还是在后台使用(部分)透明,类似于C ++中的语言环境取决于具体情况 - 两种方法都可以。

  

是否有必要为此创建DTO?我想只是将域传递给表示层,但通过强制执行域的只读视图来保持不变性。

关于地址,我会尝试仅通过不可变对象 - 如果地址发生变化,您可以创建一个新对象并丢弃旧对象。请注意,地址很少是第一类实体,而是代理值对象(即没有自己的身份)。但当然,很大程度上取决于对象 - 关系映射解决方案和数据库架构的细节。