基于 角色-功能 的思想实现 角色非平行类应用系统的开发

角色非平行就是如学校的教师与学生,在一个系统里,这两者是不相容的,在以往的系统中,往往是按照实体建立类,建立管理类对实体有增删改查功能,通过权限来限制访问,如一条新闻,教师有增删改查,学生可以查,还有教师开课,学生选课,往往权限设置很复杂,而且这些功能在需求分析时就已经固定了,通过配置来得到的灵活性并无大的意义。

 

如某某老师修改新闻,ID是多少

在现实生活中,我们说话往往不是按照实体管理-功能来说,判断有没有权限,然后 NewsManage/Edit/123

而是以角色-功能来说,因为权限往往已经隐含在角色中了 -> Teacher/EditNews/123

 

之前写过一篇 角色是用户分组还是功能分组,我实现的一个按功能分组的角色管理的思考 ,当时只是有这个想法,走了不少弯路,最终还是完成了整个系统的开发。

 

在新完成的系统中,抛弃了DAL BLL UI 这样的三层架构,使用核心层,角色层,和UI层架构,核心层还是使用传统方式,对实体进行处理,我选用linq to sql,

以Project为例,DataAccess.Project 是linq自动生成的实体,  Entity.Project 是自己定义的实体,用于层间传递

 

代码
       Public Shared Function RetrieveProject(ByVal predicate As Expression(Of Func(Of DataAccess.Project, Boolean))) As List(Of Entity.Project)

            
Using dataContext As New DataAccess.ProjectManageDataContext(ConnString)

                dataContext.ObjectTrackingEnabled 
= False

                
Dim result = From p In dataContext.Projects.Where(predicate) _
...
                             
Select New Entity.Project With { _
                             .ProjectId 
= p.ProjectId, _
...
                             }

                
Return result.ToList

            
End Using

        
End Function

        
Public Shared Sub UpdateProject(ByVal predicate As Expression(Of Func(Of DataAccess.Project, Boolean)), ByVal action As Action(Of DataAccess.Project, Entity.Project), ByVal ep As Entity.Project)

            
Using dataContext As New DataAccess.ProjectManageDataContext(ConnString)

                
Dim projects = From p In dataContext.Projects.Where(predicate)
                
For Each project In projects
                    action(project, ep)
                
Next

                dataContext.SubmitChanges()

            
End Using

        
End Sub


        
Public Shared Function InsertProject(ByVal project As Entity.Project) As Integer

            
Using dataContext As New DataAccess.ProjectManageDataContext(ConnString)

                
Dim dbProject As New DataAccess.Project

                dbProject.DutyOrganization 
= project.DutyOrganization
...
                dataContext.Projects.InsertOnSubmit(dbProject)
                dataContext.SubmitChanges()

                
Return dbProject.ProjectId

            
End Using

        
End Function

        
Public Shared Sub DeleteProject(ByVal predicate As Expression(Of Func(Of DataAccess.Project, Boolean)))

            
Using dataContext As New DataAccess.ProjectManageDataContext(ConnString)

                dataContext.Projects.DeleteAllOnSubmit(dataContext.Projects.Where(predicate))
                dataContext.SubmitChanges()

            
End Using

        
End Sub

 

 

角色层根据实际情况进行继承,教师和学生可继承与用户基类,管理员可以从教师派生

如教师

 

代码
    Public Class Teacher
        
Inherits User

        
Public Function GetMyDirectorProject() As ReadOnlyCollection(Of Entity.Project)

            
Return New ReadOnlyCollection(Of Entity.Project)(DataAccess.AccessProjectHelper.RetrieveProject(Function(p As DataAccess.Project) p.Director = Me.Id))

        
End Function

    
End Class

 


目前正在思考把asp.net mvc模式与这个结合,在mvc模式中,控制器非常适合作为角色来使用,这样网址也非常清晰的显示为角色/功能/参数了

posted @ 2010-03-25 11:07  我想我是风  阅读(1370)  评论(12编辑  收藏  举报