处理session(删除,增加...)操作应该放在action层吗

09-03-30 confuse

很多关于session的操作都是放在action层处理的。但感觉删除session中某个数据的这种操作也算是一种业务上的操作,当然不是说在service层里面直接操作httpsession(httpsession还是应该放在action层),而是由action层给service层传入一个sessionMap/sessionDto之类的,然后service层操作这个sessionDto。如果是web应用,action传给service的sessionDto就相当于httpsession,如果是桌面应用,那action传给service的就不是httpsession了,而是另外一种session作用域的Map/Dto,这样,即使web应用替换成桌面应用,service层也不会有变更,仅仅是action层变更(传递不同类型的sessionDto给service层)。service层处理sessionDto还可以减少action层的逻辑处理,这样绝大多数action就可以用一个类来统一处理(否则,对于不同的session处理还要写不同的action类)。不知道这样设计是否可行,还是说放在service层处理有啥不好的(或者说放在action层处理有什麽好处),请教banq大哥及牛人们,谢谢。

wlmouse
2009-03-30 23:33

Session你这里应该指HttpSession。现在基本上大家的观点都是这个东西里不要放业务的东西。业务数据应该保存到领域层。你保存到表现层,当然要在表现层处理。你要在Service层中处理,要么你把业务数据移动到Service,要么就还在Action中处理。你非要追求Service的形式,其实很多业务的东西还在Action,除了造成这两层难以解耦外,我没看到有什么好处。

confuse
2009-03-30 23:52

Session你这里应该指HttpSession
>我这里指的不光是httpsession,当然web应用对应的是httpsession,对于桌面应用没有httpsession,换一种存储方式。
你非要追求Service的形式,其实很多业务的东西还在Action
>不是很明白呵呵。界面上的东西还是先传递给Action的,然后Action把界面上获得的数据还有session之类的数据打包传递给service,最后根据service处理结果返回界面,就不干别的了,这里面有多余的吗?还是说有不够的?
如果对于web应用,有部分业务数据保存在了httpsession中,然后传入service(当然不是直接把httpsession形式的变量传过去,而是包装成一个sessionMap或者一个sessionContext之类的),但是对于service是不知道这是个httpsession,还是个别的,只知道这是个Map/Context(对于service获得的sessionMap/sessionContext不一定就是httpsession),这样对于web应用切换到桌面应用,只不过action层把传过去的sessionMap/sessionContext变了,而service层不变。
要么你把业务数据移动到Service,要么就还在Action中处理。
>我就是想把业务数据移动到service处理
不知道把自己的意图讲明白没有,谢谢,麻烦再帮忙分析下。
[该贴被confuse于2009-03-31 09:43修改过]

confuse
2009-04-13 17:29

关于session处理的疑惑,专门看了看jivejdon的实现方式,有些理解不知道对不对。
第一,本贴讨论的session不是httpsession,用jdon的观念来讲应该算是业务层session,当web应用的时候,jdon好像是以httpsession作为业务session的容器。但是,你也可以改变,用别的东西作为容器(桌面应用情况应该会用别的)。
第二,存取业务层session操作自然属于业务逻辑处理,所以自然放在service层。e.g.:往一个购物车里面加入产品。jivejdon中的业务层session应该是sessionContext,在ForumMessageShell等service类中显式的调用sessionContextUtil方法取得sessionContext中的数据。e.g.:"com.jdon.jivejdon.model.Account account = sessionContextUtil.getLoginAccount(sessionContext);".(此处sessionContext对象是被别的模块直接注入到service类中的)
感觉对业务层session的存取操作和对数据库的存取操作还是有相似之处的,都有点仓储的概念,对业务session存取的实现放在基础设施层,在领域层间接的,仅仅委派基础设施层的方法来获得sessionContext所存储的东西,这样做如何?当然这些操作本身肯定不是业务的核心操作,只是有点仓储的意思。我接触DDD甚少,所以希望大侠门指导下,有理解完全不靠谱的希望指出,谢谢!
最后想问下,像jivejdon这种service类中直接处理sessionContext的方式是不是比较不错呢?我个人感觉是没有什末不好的。
[该贴被confuse于2009-04-21 14:52修改过]