随笔 - 11, 文章 - 1, 评论 - 20, 引用 - 0
数据加载中……

不完美的世界-看到了IOC工具的又一个发展方向

最近在继续深入的,完整的实现前面文章《基于事件分发机制的企业应用开发 》和《基于拦截器的企业应用构造》中所构思的想法,在印象中,权限系统和组织结构是任何一个ERP系统都会用到的,不是随便两下就能实现的简单功能模块,实现了这两个子模块后,无论什么地方都会用得着,于是便从这两个功能入手,目前把基于RBAC的权限系统完整实现了,组织结构实现了80%,随着代码以及逻辑的增加,基于Spring IOC的配置也开始复杂起来,不过这个是无法避免的,毕竟系统目标是高度可定制,高度灵活的可配置性就意味着复杂性,这里的复杂性不是仅仅指Spring配置语法,而是指各个Bean之间的关系,每一个Service目前都必须做事务控制,安全控制,事件转换,而且问题已经不仅仅是Service的配置问题了,随着系统事件的增多,慢慢的各个事件间的逻辑关系也必须被表示出来,使得目前不得不引入了事件堆栈的概念,用来表示源于同一个操作导致的雪崩式的事件关系,目前的事件堆栈还比较简单,但是作为一个架构设计人员的敏感,我们已经嗅到了还需要把事件管理深化下去的一丝气味。这些层次,这些逻辑,已经是不能简单的靠看Spring配置才能理解的了,这个还是我们一个JVM进程能产生的需求,而多个程序,甚至多个系统集成的概念需求(例如SOA),会比这个更加复杂。在本例中,系统需要一个图形化的容易管理配置bean之间复杂关系的工具的需求越来越迫切。很自然的,我们得出一个结论:系统配置的图形化,形象化成为了业界可能的下一个发展方向。

ps:该工具最好是一个图形化的,可作进行运行时“热修改”的配置定义工具兼Service管理工具,JMX似乎是一个可以考虑的方向,不过还没想清楚如何与该配置工具紧密结合,我只是希望能够象扳动水管开关一样调整各个图形间的连接,系统里的事件流就会随之改变,事务管理,安全控制也会随之改变。不知道哪位同学知道有类似功能的东西,还劳请留个言告知一声。如果没有的话,就只能等本系统告一段落后再来解决这个问题了。如果您正在发愁不知发展方向在哪,看到了这篇文章而有所启发去做出这样一个工具的话,还希望能便宜点卖我一份 ;)。


虽然上面说了那么多,指出了IOC工具的又一个发展方向,但是我目前面临的问题还没有解决 :(

为了展示一下这个复杂度,现在把该系统其中的两个模块的Spring配置show出来:
<beans>
    
<!-- 组织 -->
    
<bean id="orgService" parent="baseTxProxy">
        
<property name="target"><ref local="orgServiceProxy"/></property>
    
</bean>
    
<bean id="orgServiceImpl" class="com.wolfsquare.ibase.org.service.OrgService" autowire="byName">
        
<property name="orgTypeService">
            
<ref bean="orgTypeServiceImpl"/>
        
</property>
    
</bean>    

    
<!-- 组织类型 -->
    
<bean id="orgTypeService" parent="baseTxProxy">
        
<property name="target"><ref local="orgTypeServiceImpl"/></property>
    
</bean>
    
<bean id="orgTypeServiceImpl" class="com.wolfsquare.ibase.org.service.OrgTypeService" autowire="byName"/>
    
    
<!-- 单位 -->
    
<bean id="unitService" parent="baseTxProxy">
        
<property name="target"><ref local="unitServiceImpl"/></property>
    
</bean>
    
<bean id="unitServiceImpl" class="com.wolfsquare.ibase.org.service.UnitService" autowire="byName">
        
        
<property name="lifecycleListeners">
            
<list>
                
<!--<ref bean="unitListener"/>-->
                
<ref bean="objectSyncOrgListener"/>
            
</list>
        
</property>
        
    
</bean>
    
    
<bean id="unitListener" class="com.wolfsquare.ibase.org.listener.UnitListener"  autowire="byName">
        
<property name="roleService"><ref bean="roleService"/></property>
    
</bean>
        
    
<!-- 个人 -->
    
<bean id="personService" parent="baseTxProxy">
        
<property name="target"><ref local="personServiceImpl"/></property>
    
</bean>
    
<bean id="personServiceImpl" class="com.wolfsquare.ibase.org.service.PersonService" autowire="byName">
        
<property name="lifecycleListeners">
            
<list>
                
<ref bean="objectSyncOrgListener"/>
            
</list>
        
</property>
    
</bean>
    
<!-- 身份-角色侦听器 -->
    
<bean id="personRoleListener" class="com.wolfsquare.ibase.org.listener.RoleListener">    
        
<property name="roleService">
            
<ref bean="roleServiceProxy"/>
        
</property>
    
</bean>
    
<!-- 组织机构创建删除-资源同步 监听器 -->
    
<bean id="orgResourceSyncListener" class="com.wolfsquare.ibase.org.listener.OrgResourceSyncListener">
        
<property name="categoryName"><value>组织机构</value></property>            
        
<property name="resourceService">
            
<ref bean="resourceServiceImpl"/>
        
</property>
        
<property name="includeTypes">
            
<list>
                
<value>unit</value>
                
<value>person</value>
                
<value>role</value>
            
</list>
        
</property>
    
</bean>

    
<bean id="orgRoleListener" class="com.wolfsquare.ibase.org.listener.OrgRoleListener">    
        
<property name="roleService">
            
<ref bean="roleService"/>
        
</property>
        
<property name="excludeTypes">
            
<list>
                
<value>role</value>
            
</list>
        
</property>
    
</bean>
    
<!-- 组织结构对象删除侦听器 ,需要挂接到需要同步的Service上-->
    
<bean id="objectSyncOrgListener" class="com.wolfsquare.ibase.org.listener.ObjectSyncOrgListener">    
        
<property name="orgService">
            
<ref bean="orgServiceImpl"/>
        
</property>
    
</bean>

    
<bean id="personToOrgRoleListener" class="com.wolfsquare.ibase.org.listener.PersonToOrgRoleListener">    
        
<property name="roleService">
            
<ref bean="roleServiceProxy"/>
        
</property>
    
</bean>    
    
<bean id="orgSecurityListener" class="com.wolfsquare.ibase.org.listener.SecurityListener">    
        
<property name="permService">
            
<ref bean="permServiceImpl"/>
        
</property>
        
<property name="resourceService">
            
<ref bean="resourceServiceImpl"/>
        
</property>    
        
<property name="functionService">
            
<ref bean="functionServiceImpl"/>
        
</property>        
    
</bean>    

    
<bean id="orgServiceProxy" class="org.springframework.aop.framework.ProxyFactoryBean">
        
<property name="target">
            
<ref local="orgServiceImpl"/>
        
</property>
        
<property name="interceptorNames">
            
<list>
                
<value>rsi</value>
            
</list>
        
</property>
        
<property name="singleton">
            
<value>true</value>
        
</property>
    
</bean>
    
    
<bean id="orgEventBrocaster" class="com.wolfsquare.ibase.org.event.OrgEventBrocaster" singleton="true">
        
<property name="lifecycleListeners">
            
<list>
                
<ref bean="orgSecurityListener"/>            
                
<ref bean="orgResourceSyncListener"/>
                
<ref bean="orgRoleListener"/>
                
<ref bean="personToOrgRoleListener"/>       
            
</list>
        
</property>
    
</bean>
</beans>
角色模块的配置:
<beans>
    
<!-- 角色 -->
    
<bean id="roleService" parent="baseTxProxy">
        
<property name="target"><ref local="roleServiceProxy"/></property>
    
</bean>
    
<bean id="roleServiceImpl" class="com.wolfsquare.ibase.role.service.RoleService" autowire="byName">
        
<property name="personService">
            
<ref bean="personServiceImpl"/>
        
</property>
    
</bean>
    
    
<bean id="roleServiceProxy" class="org.springframework.aop.framework.ProxyFactoryBean">
        
<property name="target">
            
<ref local="roleServiceImpl"/>
        
</property>
        
<property name="interceptorNames">
            
<list>
                
<value>rsi</value>
            
</list>
        
</property>
        
<property name="singleton">
            
<value>true</value>
        
</property>
    
</bean>

    
<bean id="rsi" class="com.wolfsquare.core.service.ServiceInterceptor">
        
<property name="interceptorMap">
            
<map>
                
<entry key="com.wolfsquare.ibase.role.service.RoleService">
                    
<list>
                        
<ref local="eventBrocaster"/>
                    
</list>
                
</entry>
                
<entry key="com.wolfsquare.ibase.org.service.OrgService">
                    
<list>
                        
<ref bean="orgEventBrocaster"/>
                    
</list>
                
</entry>
            
</map>
        
</property>
    
</bean>
    
    
<bean id="eventBrocaster" class="com.wolfsquare.core.service.EventBrocaster" singleton="true">
        
<property name="lifecycleListeners">
            
<list>
                
<ref bean="objectSyncOrgListener"/>
                
<ref bean="personRoleListener"/>
            
</list>
        
</property>
    
</bean>

</beans>

最后,为了避免文章过于枯燥,还是show一下系统截图吧;)

一个典型的组织创建操作导致的事件的产生传递图:


组织管理的界面:

当前用户的权限,按角色分类:右边根节点表示的是登录帐户,王小二是身份,相当于权限场景(session)

整个组织的权限分布图:

应某位同学的要求,把系统实体图加上:

posted on 2006-06-08 00:30 wolfsquare 阅读(1926) 评论(7)  编辑  收藏 所属分类: 企业应用

评论

# re: 不完美的世界-看到了IOC工具的又一个发展方向  回复  更多评论   

我想看看你的基本实体是什么,以及他们之间的关系。
比如组织机构,用户,角色,应用(资源),权限等
2006-06-08 08:13 | 人要有梦想

# re: 不完美的世界-看到了IOC工具的又一个发展方向  回复  更多评论   

我个人觉得,

组织可以是个树型结构,人员不是,人员之间的关系很复杂。人组之间的关系是多对多。人,组,人组关系都是角色分配的对象。角色是对资源权限的一个划分,划分标准可以不同,可以多样性。资源可以是应用,比如你说的菜单其实就是一个应用的树。而权限呢?应该是应用的权限,这个权限可以分级别的。可以有操作上的,可以有数据上的,可以有应用接口级别的,等等,粒度可以自由控制。

2006-06-08 08:28 | 人要有梦想

# re: 不完美的世界-看到了IOC工具的又一个发展方向  回复  更多评论   

加上了实体图(最后一幅),RBAC以及其衍生类型已经非常成熟了,几乎没有什么可以讨论的了。
2006-06-08 20:03 | wolfsquare

# re: 不完美的世界-看到了IOC工具的又一个发展方向  回复  更多评论   

我想问一下,对于分级的权限管理,在你的这个模型里面如何实现,就是每一个组织机构和部分,比如你上面的洗衣科技和天庭实业,如果想实现能分别管理自己公司内部的权限,可以添加、修改角色,管理本公司人员信息,你现在的设计能做到这个需求么
这里要注意,两个子公司可能都有普通职员这个角色,但是实际权限不同的,或者洗衣科技想修改普通职员角色的权限,而不能影响到天庭实业
2006-06-08 23:31 | 绿色使者、绿色心情

# re: 不完美的世界-看到了IOC工具的又一个发展方向  回复  更多评论   

可以的,这是权限分离的最基本的要求,各个实体(公司,角色,人员)间对应的角色是分立的,无关的。从权限设置上来看:
组织结构一共有9种操作,其中前面三种不需要资源
adminRootUnit
adminRootPerson
adminRootRole
adminOrgUnit *
adminOrgPerson *
adminOrgRole *
deleteOrgUnit *
delteOrgPerson *
deleteOrgRole *
打了星号的操作是需要指定组织资源的,在这里,你可以将其等同于目标组织。

实际上,复杂的地方是需要子公司继承母公司的权限的时候,要特别定制,当然,由于系统的目标是高度可配置,所以这点的代码非常非常少。
2006-06-08 23:51 | wolfsquare

# re: 不完美的世界-看到了IOC工具的又一个发展方向  回复  更多评论   

是不是可以根据自己的应用实现一个GUI,类似:暂停服务-〉修改配置-〉恢复服务
2006-06-11 20:45 | Andy luo

# re: 不完美的世界-看到了IOC工具的又一个发展方向  回复  更多评论   

支持一下....很不错的思路和实现!
2007-01-04 11:01 | BeanSoft

只有注册用户登录后才能发表评论。


网站导航: