DCI的实际例子

我正在开发一个可视化网站制作系统,当然和DW不同,这个产品有其特别之处。不过我们抛弃产品本身,我来说说我采用DDD DCI的一些概念的开发经验,希望Banq大哥和大家指正。

这个项目加入了两个角色,类似DCI中的角色扮演,有 Guest 和 Manager 角色。

当Guest进入系统时,会具有查看功能,Manager进入系统具有管理功能。而应用层直接与Manager和Guest交互,而不是直接与Domain层交互,也就是说Guest和Manager也可以理解为是 UIProxy , 这个好处有很多,其中之一就是让一套系统的Domain封装起来,而其他系统的Domain层,可以通过 UIProxy进行访问,而其中的DOmain是很解偶的,自成体系。

UI <---> APP <---> | UIProxy(Guest/Manager)<---> Domain core | , 当然,我们发现UIProxy也是Domain层的,只不过,他充当外交官的角色。另外UIProxy的每个操作方法都有callback,这样就与App的基础框架层完美结合,又避免侵入Domain core层。

我们知道任何一套Domain系统,必然要和外在沟通,而外在调用这个系统时,必然充当某个角色。

以上也就是以前我提出的 U-DCI 理论。现在这套系统运作的不错,因为我这个项目有两个系统,这两个系统有一部分要交互,我就用U-DCI的方式,让他们分为两个系统,也就是做两套 Domain,然后每个Domain前端有个小口子,严格控制其操作,外面的“人”只能通过这个UIProxy进行操作。继续编码,有空再写点。
[该贴被brighthas于2011-08-04 10:37修改过]

这个U-DCI和我用liontseng发表的U-DCI不太一样,以前我想让 UIProxy 和技术层有所耦合,后来发现,不太好。

我在实际项目中用的的方式,类是与下面的代码。



app.get('/addnewpage',function(req,res){
repo.user.findById(repo.user.WRITEMODE,req.session.loginuser.id,function(user){
user.addNewPage(function(newpageid){
if(newpageid){res.send('create new page success!')}
else{res.send('create new page error!')}
});
})
})

当然 repository 我已经优化,不必每次都调用DB,repository会智能调用 store 内部方法进行持久化,因为持久化我们可以忽略,我们可以理解为“内存永存,所有的对象都在内存中存活” ,当然这个不太现实,不过应用代码会感觉如此。和DB一点关系都没有了。

[该贴被brighthas于2011-08-04 10:56修改过]