cnbond
2008-12-10 16:21
Factory是必须的.就向我上面说的一样,一般情况下领域对象不能缺少工厂.工厂的职责是"创建",而不是"重建".仓库可以负责重建.

spring7777777
2008-12-10 17:03

工厂模式是不是这样加的?

感觉 主要是来创建 实体的


freebox
2008-12-10 18:50
我认为factory应该可以持有repository的引用,不然有的关联实体已经在生命周期里,那就不是新建而是重建了,重建必然要用仓储管理。factory还可以持有一些spec接口

class Factory{
  RepositoryInterface rep1,rep2;
  SpecInterface spec1,spec2;
}
class Model{
  void doXYWith(M2 m2){
    this.state=newState;
    m2.state=newStateByFixWithCurrentModel;
  }
}
class Service{
  Model model;
  Model m2;
  RepositoryInterface rep;
  FactoryInterface factory;
  void doXXX(Object otherParams){
    model=rep.reload();//已存在的对象重建
    m2=factory.create();//不存在的对象新建
    rep.save(m2);//新建的对象加入仓库
    //到此为止model和m2都已经在仓库里了,也都找出来了,下面就是业务作业
    model.doXYWith(m2,otherParams);//model和m2的状态被改变,期间可以包含很多规则约束,因为这俩东西都在仓库中,事务结束的时候状态应该同步回DB,如果使用hibernate等等就不用显示update了。
  }
}
<p>

[该贴被freebox于2008-12-10 18:51修改过]

spring7777777
2008-12-10 20:12
rep.save(m2);//新建的对象加入仓库

请问这里的 仓库 是不是 指 仓储(repository)。

ls的 仓库 说起来感觉像 session 之类的缓存

仓储应该是一些 存储,检索,查询功能的 实现吧。

还有:

model=rep.reload();//已存在的对象重建

m2=factory.create();//不存在的对象新建

怎么区别一个对象是新对象 还是 旧对象呢?

谢谢 freebox 的指教

freebox
2008-12-12 11:24
仓储就是对象的仓库,反正通过它直接得到对象(本身就是根)或得到根了,至于这些对象本来是在哪里的,是仓储内部的事。

新的对象和已有对象的区别:新下个单,刚建好单但是还没下单,订单是存在的,也有ID(手工派发),但是订单集合是不知道它的存在的,是个外部的东西,就像new一个string,必须通过Set.add(string),Set才知道它拥有这么样的一个实例了。否则string还在那,set也在那,但它俩不能互相感知。重建就是订单已在集合里了,不能说我下了一个单,再拿出来就不是我的了,这需要标识这种实体对象并覆写equals等,让它们在重建的时候保证是业务上的同一个对象,尽管某些属性可能被修改过(添了新商品或放弃某些商品),但它仍旧是同一个订单。

猜你喜欢