如何在DAO层中使用会话变量?

时间:2013-02-06 09:50:20

标签: java spring jsf-2

我有一个@SessionScoped ApplicationBean,用于存储用户登录信息,并按照here成功将其注入其他托管bean。

我也通过@ManagedProperty注释使用我的Dao接口,但我觉得我的用法有问题。

假设StockDao有一个公共方法listStocks(String companyCode),当用户登录时,companyCode存储在ApplicationBean中。

所以我的托管bean像这样调用DAO层

@ManagedProperty(value = "#{appBean}")
ApplicationBean appBean;

public void getStockList() {    
    return stockDao.listStocks(appBean.getCompanyCode());       
}

这会在sql需要companyCode的地方重复。

我觉得如果我的DAO层知道了companyCode(这意味着将ApplicationBean注入到DAO中)会更好,我应该使用我的方法,如下所示

public void getStockList() {    
    return stockDao.listStocks();       
}

所以问题是,哪种API设计会更好,如果你投票选择第二种,我怎样才能将@SessionScoped bean注入DAO层?

2 个答案:

答案 0 :(得分:2)

对我来说,第一种方法更清洁, 我不想将DAO层与会话管理bean绑定。

我将我的一般工件特别是daos和数据模型打包为一个单独的Jar,没有任何外部依赖 这样我就可以使用相同的方法,无论是Web应用程序,独立还是EJB

这使您的Dao与

中提取公司代码的方式/位置无关

答案 1 :(得分:2)

您不在DAO层中使用会话变量。缺乏业务逻辑和用户界面问题正是DAO的一个原因:一个负责抽象数据访问的层。

如果添加与会话相关的状态,则会将DAO层转换为DAAMUIS层(无处不在的数据访问和其他用户界面的东西层)。我并不是说DAAMUIS是错的还是邪恶的,只是这个问题需要改述。