论坛首页 Java企业应用论坛

总结一下最近关于domain object以及相关的讨论

浏览 206919 次
该帖已经被评为精华帖
作者 正文
   发表时间:2005-03-31  
同意第二种方法。
但是我们目前的做法是对贫血的Item 派生子类来添加 状态相关的方法。
我们系统不是BS结构的,而是richclient+EJB,这样贫血的Item可以在客户端进行引用。虽然更好的办法是写一些DTO对象,但是这样有太多的DTO和实体对象是一样的。
这样做还可以将实体对象、DAO能够独立出来由专人进行维护。
0 请登录后投票
   发表时间:2005-04-08  
如果domain object需要引用DAO接口,那么这个DAO接口该如何注入domain object呢?一般,domain object是利用O/RMapper从数据库里load出来的,或者就直接被new也是有可能的。如何注入DAO或者其他接口?硬编码set?
0 请登录后投票
   发表时间:2005-04-08  
drliujia 写道
如果domain object需要引用DAO接口,那么这个DAO接口该如何注入domain object呢?一般,domain object是利用O/RMapper从数据库里load出来的,或者就直接被new也是有可能的。如何注入DAO或者其他接口?硬编码set?

传统点儿,用factory design pattern
时髦点儿,用 ioc / di 容器(Spring?)
辛苦点儿,自己用reflect + xml吧。
0 请登录后投票
   发表时间:2005-05-11  
老实说,看完了整个帖子之后。
真有点激动。

我现在正在走的路正是楼主走过的,所有的疑惑与担忧现在已经一扫而光。

我现在的设计正是将Service与DAO合为一体,以及将Domain Logic写在Domain Object中的模型。

可是还是有不少的问题想请教, 现在在Domain Object里面有不少的Domain Logic Function。

它们与Getter、Setter堆在一起很显得凌乱。
怎么样把这些规划得好点呢?

因为Domain Logic Function都是public的,这样就避免不了开发人员在Web Action层面跳过逻辑层直接调用这些Domain Logic Function。
在设计里面又可不可以约束这些东西呢?
0 请登录后投票
   发表时间:2005-05-11  
引用
因为Domain Logic Function都是public的,这样就避免不了开发人员在Web Action层面跳过逻辑层直接调用这些Domain Logic Function。
在设计里面又可不可以约束这些东西呢?


在Web Action里面为什么不可以调用Domain Logic呢?
0 请登录后投票
   发表时间:2005-05-12  
因为整个逻辑可能是一堆的Domain Object一起协作完成的。单单在一个Domain Object里只是完成这个个体的功能。所以必须要经过业务逻辑层,让它提供一个场景的环境来让Domain Object群来工作。

但是团队部分开发者,就会直接用"."操作符之后看到一个Domain Logic Function之后就调用,并以为完成了任务。这是想约束的。
0 请登录后投票
   发表时间:2005-05-16  
引用
因为整个逻辑可能是一堆的Domain Object一起协作完成的。单单在一个Domain Object里只是完成这个个体的功能。所以必须要经过业务逻辑层,让它提供一个场景的环境来让Domain Object群来工作。

这是典型的Facade的使用case.
View-->Facade Logic(整个逻辑的表现/事务的控制)-->Domain Object

引用
它们与Getter、Setter堆在一起很显得凌乱。
怎么样把这些规划得好点呢?

同意,这是个很重要的问题,不知道有没有什么好的解决方案.
0 请登录后投票
   发表时间:2005-05-16  
sun_wind 写道

引用
它们与Getter、Setter堆在一起很显得凌乱。
怎么样把这些规划得好点呢?

同意,这是个很重要的问题,不知道有没有什么好的解决方案.


一个简单的解决办法是:
将Getter, Setter写在Class A里,
然后Class B extends Class A, 里面放所有的Domain Object Function。

Drawback:
变成了class * 2 数量的Model类,可能更麻烦。
而且它占用了宝贵的单一继承。

但是Everything is a tradeoff, 有什么更好的办法呢?
0 请登录后投票
   发表时间:2005-05-17  
if you really think hiding business logic is required, you can define interface for each domain model and just expose those safe method.  for distribution system in SOA architecture, it's common used.
0 请登录后投票
   发表时间:2005-06-28  
public class Item implements Serializable { 
    //  所有的属性和getter/setter方法同上,省略 
    public Bid placeBid(User bidder, MonetaryAmount bidAmount, 
                        Bid currentMaxBid, Bid currentMinBid); 
            throws BusinessException { 
    
            // Check highest bid (can also be a different Strategy (pattern);); 
            if (currentMaxBid != null && currentMaxBid.getAmount();.compareTo(bidAmount); > 0); { 
                    throw new BusinessException("Bid too low.");; 
            } 
    
            // Auction is active 
            if ( !state.equals(ItemState.ACTIVE); ); 
                    throw new BusinessException("Auction is not active yet.");; 
    
            // Auction still valid 
            if ( this.getEndDate();.before( new Date(); ); ); 
                    throw new BusinessException("Can't place new bid, auction already ended.");; 
    
            // Create new Bid 
            Bid newBid = new Bid(bidAmount, this, bidder);; 
    
            // Place bid for this Item 
            this.getBids.add(newBid);;  // 请注意这一句,透明的进行了持久化,但是不能在这里调用ItemDao,Item不能对ItemDao产生依赖! 
    
            return newBid; 
    } 
}


public class ItemManager { 
    private ItemDao itemDao; 
    public void setItemDao(ItemDao itemDao); { this.itemDao = itemDao;} 
    public Bid loadItemById(Long id); { 
        itemDao.loadItemById(id);; 
    } 
    public Collection listAllItems(); { 
        return  itemDao.findAll();; 
    } 
    public Bid placeBid(Item item, User bidder, MonetaryAmount bidAmount, 
                            Bid currentMaxBid, Bid currentMinBid); throws BusinessException { 
        item.placeBid(bidder, bidAmount, currentMaxBid, currentMinBid);; 
        itemDao.update(item);;    // 必须显式的调用DAO,保持持久化 
    } 
}


对于楼主的domain object 方案二(正如上面所写)提出几个问题:
首先这个placeBid太简单了 我先擅自加点需求(加入这些需求只是说明技术问题,合理与否希望大家不要追究):
1)当 item 是列表A中的产品 如果拥有者是nato成员国呢么只允许卖给NATO成员国,如果是军用品只能卖给不再黑名单的国家
2)当 item 的买方协议的类型和卖方协议的类型都是不相互冲突。
这样的话该如何处理?

public class Item implements Serializable { 
    //  所有的属性和getter/setter方法同上,省略 
    public Bid placeBid(User bidder, MonetaryAmount bidAmount, 
                        Bid currentMaxBid, Bid currentMinBid); 
            throws BusinessException { 
    
            // Check highest bid (can also be a different Strategy (pattern);); 
            if (currentMaxBid != null && currentMaxBid.getAmount();.compareTo(bidAmount); > 0); { 
                    throw new BusinessException("Bid too low.");; 
            } 
    
            // Auction is active 
            if ( !state.equals(ItemState.ACTIVE); ); 
                    throw new BusinessException("Auction is not active yet.");; 
    
            // Auction still valid 
            if ( this.getEndDate();.before( new Date(); ); ); 
                    throw new BusinessException("Can't place new bid, auction already ended.");; 
            /////////////////////////////////////////////////////////////////////
            if(item.isBelongListA();); {//是列表A中的产品这个列表何时从数据库取出??
                if (item.getOwner();.getCountry();.isNato(););{  // owner 的country信息何时从列表中取出? 
                	// country是否在在nato列表中nato国家的列表何时从数据库中取得?
                   ............................	
                }

                if (item.isForArmy);{
                   bidder.getCountry();.isInblackList();   //何时从数据库中取得。。。。
                }
            }
            	
            	
            	
            /////////////////////////////////////////////////////////////////////
            // Create new Bid 
            Bid newBid = new Bid(bidAmount, this, bidder);; 
    
            // Place bid for this Item 
            this.getBids.add(newBid);;  // 请注意这一句,透明的进行了持久化,但是不能在这里调用ItemDao,Item不能对ItemDao产生依赖! 
    
            return newBid; 
    } 
}


上面的的需求和代码不一定正确但是意思就是想说明placeBid的时候还是需要很多对象的帮助才能完成任务,
这些对象的的属性哪里来?

    放在 ItemManager setXXXDao 然后全部取出来准备好 最后调用?
public class ItemManager { 
    private ItemDao itemDao; 
    public void setItemDao(ItemDao itemDao); { this.itemDao = itemDao;} 
    .....xxxDao
     public void setXXXDao(XXXDao XXXDao); { this.xxxDao = xxxDao;} 
   .....................
    public Bid placeBid(Item item, User bidder, MonetaryAmount bidAmount, 
                            Bid currentMaxBid, Bid currentMinBid); throws BusinessException { 
        。。。。。。。。。。。。。。。。。。。。。
        //把item全部装配好?                    	
        item.placeBid(bidder, bidAmount, currentMaxBid, currentMinBid);; 
        itemDao.update(item);;    // 必须显式的调用DAO,保持持久化 
    } 
}

   或者:
   	 public Item loadItemById(Long id); { 
        itemDao.loadItemById(id);; // 把item的所有属性全部都取出来??
    } 
    
 

  
  要么就利用hibernate这样的orm工具能够非显式的从数据库调用bidder.getCountry()<lazy的话自动从数据库取>
  不过这样的话dao估计就没什么用了,直接用hibernate的session 得了 ,这样manager也没什么用了?
   
不知道楼主是否能给我在这点上解惑?

    
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics