c# – 用于避免交换机语句的体系结构
发布时间:2020-12-16 00:22:45 所属栏目:百科 来源:网络整理
导读:我正在开发一个新项目,我正在努力坚持正确的设计方法.我遇到了一个switch语句的问题,我知道这是一个问题但是我无法以面向对象的方式重新考虑它. 在系统中,用户具有0..n角色.根据用户当前的角色,系统将向该用户返回一组特定数据.用户将能够执行某些操作,但不
我正在开发一个新项目,我正在努力坚持正确的设计方法.我遇到了一个switch语句的问题,我知道这是一个问题但是我无法以面向对象的方式重新考虑它.
在系统中,用户具有0..n角色.根据用户当前的角色,系统将向该用户返回一组特定数据.用户将能够执行某些操作,但不能执行其他操作等. public?class?User { ????public?bool?HasRole(string?roleName) ????{ ????????return?this.UserRoles.Any(r?=>?r.Name?==?roleName); ????} ????public?string?Username?{?get;?set;?} ????public?long??CurrentRoleId?{?get;?set;?} ????public?Role?CurrentRole?{?get;?set;?} ????public?virtual?IList<Role>?UserRoles?{?get;?set;?} } public?class?Role { ????public?Role()?{?} ????public?string?Name?{?get;?set;?} } public?class?GetEventsQuery?:?IQuery<List<Event>> { ????public?List<Event>?Query() ????{ ????????switch?(this.user.CurrentRole.Name) ????????{ ????????????case?"Administrator": ????????????????UserIsNotInAdministratorRole(); ????????????????return?repository.All.ToList(); ????????????case?"Supervisor": ????????????????UserIsNotInSupervisorRole(); ????????????????return?repository.All.Where(evnt?=>?evnt.SupervisorId?==?this.user.RecordId).ToList(); ????????????case?"User": ????????????????UserIsNotInUserRole(); ????????????????return?repository.All.Where(evnt?=>?evnt.UserId?==?this.user.RecordId).ToList(); ????????????default: ????????????????throw?new?Exception("GetEventsQuery?Unknow?exception."); ????????} ????} ????private?void?UserIsNotInUserRole() ????{ ????????if?(!this.user.HasRole("User")) ????????{ ????????????throw?new?NoUserRoleException("User?does?not?have?user?role!"); ????????} ????} ????private?void?UserIsNotInSupervisorRole() ????{ ????????if?(!this.user.HasRole("Supervisor")) ????????{ ????????????throw?new?NoSupervisorRoleException("User?does?not?have?supervisor?role!"); ????????} ????} ????private?void?UserIsNotInAdministratorRole() ????{ ????????if?(!this.user.HasRole("Administrator")) ????????{ ????????????throw?new?NoAdministratorRoleException("User?does?not?have?administrator?role!"); ????????} ????} ????public?GetEventsQuery(string?username,?IUserRepository?userRepository,?IEventRepository?repository) ????{ ????????this.repository?=?repository; ????????var?userQuery?=?new?GetUserQuery(username,?userRepository); ????????this.user?=?userQuery.Query(); ????} ????private?readonly?User?user; ????private?readonly?IEventRepository?repository; } 此switch语句将显示在系统的所有部分中.如果有一种方法可以将它重新分解为一个类并将它放在一个单独的位置,我不介意保留它,但重复一遍又一遍肯定是代码味道.我刚刚开始这个项目,所以如果有更好的方法来设计对象层次结构或做出重大改变以消除这个问题,我愿意接受它. 解决方法
角色应该是每个角色继承的公共基类(或接口)(例如管理员,主管,用户).角色的每个实现都应该具有关于该特定角色允许或不允许的信息.
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |