CSLA框架的codesmith模板改造
一直有关注CSLA框架,最近闲来无事,折腾了下,在最新的r3054版本基础上修改了一些东西,以备自己用,有兴趣的园友可以下载共同研究
1、添加了默认的授权规则
- public partial class UserInfoList
- {
- #region Authorization Rules
- /// <summary>
- /// Allows the specification of CSLA based authorization rules for a collection list. Specifies what roles can
- /// perform which operations for a given business object
- /// </summary>
- public static void AddObjectAuthorizationRules()
- {
- Csla.Rules.BusinessRules.AddRule(typeof(UserInfoList), new Csla.Rules.CommonRules.IsInRole(Csla.Rules.AuthorizationActions.GetObject, "admin","User.List"));
- }
- #endregion
- }
- public partial class UserList
- {
- #region Authorization Rules
- /// <summary>
- /// Allows the specification of CSLA based authorization rules for a collection list. Specifies what roles can
- /// perform which operations for a given business object
- /// </summary>
- public static void AddObjectAuthorizationRules()
- {
- Csla.Rules.BusinessRules.AddRule(typeof(UserList), new Csla.Rules.CommonRules.IsInRole(Csla.Rules.AuthorizationActions.GetObject, "admin","User.List"));
- }
- #endregion
- }
- public partial class User
- {
- #region Authorization Rules
- /// <summary>
- /// Allows the specification of CSLA based authorization rules. Specifies what roles can
- /// perform which operations for a given business object
- /// </summary>
- public static void AddObjectAuthorizationRules()
- {
- Csla.Rules.BusinessRules.AddRule(typeof(User), new Csla.Rules.CommonRules.IsInRole(Csla.Rules.AuthorizationActions.GetObject, "admin","User.Get"));
- Csla.Rules.BusinessRules.AddRule(typeof(User), new Csla.Rules.CommonRules.IsInRole(Csla.Rules.AuthorizationActions.CreateObject, "admin","User.Create"));
- Csla.Rules.BusinessRules.AddRule(typeof(User), new Csla.Rules.CommonRules.IsInRole(Csla.Rules.AuthorizationActions.EditObject, "admin","User.Edit"));
- Csla.Rules.BusinessRules.AddRule(typeof(User), new Csla.Rules.CommonRules.IsInRole(Csla.Rules.AuthorizationActions.DeleteObject, "admin", "User.Delete"));
- }
- #endregion
- }
2、生成权限列表的sql脚本
- insert into S_Permision(Name) values('User.List');
- insert into S_Permision(Name) values('User.Get');
- insert into S_Permision(Name) values('User.Create');
- insert into S_Permision(Name) values('User.Edit');
- insert into S_Permision(Name) values('User.Delete');
3、添加了查询支持
criteria本来的查询是每个字段都是取相等的值,改造后,cirteria中每个对应的字段都增加了一个字段名+Operator的属性。Operator的值即可根据用户选择 like ,not like ,> , < ,<>
- var form = ASPxNavBar1.Groups[].FindControl("ASPxFormLayout1") as ASPxFormLayout;
- var criteria = new Business.UserCriteria();
- Csla.Data.DataMapper.Map(FormHelper.GetFormData(form), criteria);
- return criteria;
- public class FormHelper
- {
- public static Dictionary<string, object> GetFormData(DevExpress.Web.ASPxFormLayout.ASPxFormLayout form)
- {
- var dict = new Dictionary<string, object>();
- foreach (DevExpress.Web.ASPxFormLayout.LayoutItem item in form.Items)
- {
- if (string.IsNullOrEmpty(item.FieldName)) continue;
- if (dict.ContainsKey(item.FieldName))
- throw new Exception("布局中存在重复的字段");
- var value = form.GetNestedControlValueByFieldName(item.FieldName);
- if (value != null)
- dict.Add(item.FieldName, value);
- }
- return dict;
- }
- }
4、添加了批量删除
没有加到模板中,直接复制即可使用,但是用到了criteria中新加的属性
- [Serializable]
- public class MultyDeleteCommand<T, C> : CommandBase<MultyDeleteCommand<T, C>>
- where T : BusinessBase<T>
- where C : IGeneratedCriteria, new()
- {
- #region Authorization Methods
- public static bool CanExecuteCommand()
- {
- return Csla.Rules.BusinessRules.HasPermission(Csla.Rules.AuthorizationActions.DeleteObject,
- typeof(T));
- }
- #endregion
- #region Factory Methods
- public static bool Execute(IEnumerable<object> pkList)
- {
- if (!CanExecuteCommand())
- throw new System.Security.SecurityException("没有权限执行删除操作");
- MultyDeleteCommand<T, C> cmd = new MultyDeleteCommand<T, C>();
- cmd.PKList = pkList;
- cmd.BeforeServer();
- cmd = DataPortal.Execute<MultyDeleteCommand<T, C>>(cmd);
- cmd.AfterServer();
- return cmd.Result;
- }
- private MultyDeleteCommand()
- { /* require use of factory methods */ }
- #endregion
- #region Client-side Code
- public static readonly PropertyInfo<bool> ResultProperty = RegisterProperty<bool>(p => p.Result);
- public bool Result
- {
- get { return ReadProperty(ResultProperty); }
- set { LoadProperty(ResultProperty, value); }
- }
- public IEnumerable<object> PKList { get; set; }
- private void BeforeServer()
- {
- // TODO: implement code to run on client
- // before server is called
- }
- private void AfterServer()
- {
- // TODO: implement code to run on client
- // after server is called
- }
- #endregion
- #region Server-side Code
- protected override void DataPortal_Execute()
- {
- string temp = ""; string key = "";
- var criteria = new C();
- if (string.IsNullOrWhiteSpace(criteria.TableFullName) || string.IsNullOrWhiteSpace(criteria.PKName))
- throw new Exception("表名和主键名不能为空");
- SqlParameter[] parm = new SqlParameter[PKList.Count()]; //初始化参数个数
- for (int i = ; i < PKList.Count(); i++)
- {
- key = "@StringId" + i.ToString();
- temp += key + ","; //将每个参数连接起来
- parm[i] = new SqlParameter(key, PKList.ElementAt(i));
- }
- temp = (temp + ")").Replace(",)", ""); //去掉最后一个逗号
- string commandText = string.Format("DELETE {0} WHERE [{1}] IN ({2})",criteria.TableFullName, criteria.PKName, temp);
- if (!string.IsNullOrEmpty(criteria.SoftDeletedName))
- commandText = string.Format("UPDATE {0} SET [{1}]=1 WHERE [{2}] IN ({3})", criteria.TableFullName, criteria.SoftDeletedName, criteria.PKName, temp);
- using (var connection = new SqlConnection(ADOHelper.ConnectionString))
- {
- connection.Open();
- using (var command = new SqlCommand(commandText, connection))
- {
- command.Parameters.AddRange(parm);
- //result: The number of rows changed, inserted, or deleted. -1 for select statements; 0 if no rows were affected, or the statement failed.
- int result = command.ExecuteNonQuery();
- if (result == )
- throw new DBConcurrencyException("您提交的数据已过期,请刷新您的界面后重试.");
- else
- Result = true;
- }
- }
- }
- #endregion
- }
5、添加了软删除的功能
当数据表中有一列名为bit类型的DeleteFlag(默认值为0,not null)时,自动启用软删除,即执行对象的删除操作时并不是从数据库中删除对象,而是设置DeleteFlag字段为1,使用criteria条件查询时,除非指定显式设置DeletedFlag属性值,否则默认按照DeleteFlag<>1查询,即已经删除的记录不会查出来,就像真的被从数据库中删除了一样。
如果要修改数据库中的列名,修改模板Common\AutoColunmConfig.cst中的DeletedFlag属性即可
6、添加了添加修改时间,创建者修改者的自动处理
7、添加了禁止删除系统预设字段的业务规则(不在模板中,复制代码在需要的地方调用即可)
- public class DenyDeleteSystemDefinedObject<T> : Csla.Rules.CommonRules.IsInRole
- where T : Csla.BusinessBase<T>
- {
- Func<T, bool> isSystemDefined;
- public DenyDeleteSystemDefinedObject(Func<T, bool> _isSystemDefined, params string[] roles)
- : base(Csla.Rules.AuthorizationActions.DeleteObject, roles)
- {
- isSystemDefined = _isSystemDefined;
- }
- protected override void Execute(Csla.Rules.AuthorizationContext context)
- {
- base.Execute(context);
- if (!context.HasPermission) return;
- if (context.Target != null && context.Target is T && isSystemDefined(context.Target as T))
- {
- context.HasPermission = false;
- throw new System.InvalidOperationException(Properties.Resources.SystemDefinedObjectCannotDelete);
- }
- }
- }
使用方式,例如:有一个系统设置的根对象Setting:
- public partial class Setting: BusinessBase<Setting>
- {
- static Dictionary<int, string> _systemDefinedList = null;
- /// <summary>
- /// 系统预设值
- /// </summary>
- public static Dictionary<int, string> SystemDefined
- {
- get
- {
- if (_systemDefinedList == null)
- {
- _systemDefinedList = new Dictionary<int, string>();
- _systemDefinedList.Add(, "站点名称");
- _systemDefinedList.Add(, "LOGO图片");
- }
- return _systemDefinedList;
- }
- }
- public bool IsSystemDefined
- {
- get
- {
- return Setting.SystemDefined.ContainsValue(KeyName) || Setting.SystemDefined.ContainsKey(Identification);
- }
- }
- #region Authorization Rules
- /// <summary>
- /// Allows the specification of CSLA based authorization rules. Specifies what roles can
- /// perform which operations for a given business object
- /// </summary>
- public static void AddObjectAuthorizationRules()
- {
- Csla.Rules.BusinessRules.AddRule(typeof(Setting), new Csla.Rules.CommonRules.IsInRole(Csla.Rules.AuthorizationActions.GetObject, "admin", "Setting.Get"));
- Csla.Rules.BusinessRules.AddRule(typeof(Setting), new Csla.Rules.CommonRules.IsInRole(Csla.Rules.AuthorizationActions.CreateObject, "admin", "Setting.Create"));
- Csla.Rules.BusinessRules.AddRule(typeof(Setting), new Csla.Rules.CommonRules.IsInRole(Csla.Rules.AuthorizationActions.EditObject, "admin", "Setting.Edit"));
- Csla.Rules.BusinessRules.AddRule(typeof(Setting), new DenyDeleteSystemDefinedObject<Setting>(
- s => s.IsSystemDefined, "admin", "Setting.Delete"));
- }
- #endregion
- partial void OnDeleting(SettingCriteria criteria, ref bool cancel)
- {
- if (Setting.SystemDefined.ContainsValue(criteria.KeyName)
- || Setting.SystemDefined.ContainsKey(criteria.Identification))
- {
- throw new System.InvalidOperationException(Properties.Resources.SystemDefinedObjectCannotDelete);
- }
- }
- }
注意事项:
附:可能由于CSLA对使用者的要求相对其他框架较高,目前国内CSLA的学习社区太少,这么优秀的框架,居然国内都不火,真是可惜了,我建了个交流群,欢迎感兴趣的朋友一起来学习。
CSLA&DevExpress交流群: 367088648
CSLA框架的codesmith模板改造的更多相关文章
- DotNet 资源大全中文版,内容包括:编译器、压缩、应用框架、应用模板、加密、数据库、反编译、IDE、日志、风格指南等
DotNet 资源大全中文版 我想很多程序员应该记得 GitHub 上有一个 Awesome - XXX 系列的资源整理.awesome-dotnet 是由 quozd 发起和维护.内容包括:编译器. ...
- csla框架__使用Factory方式实现Csla.BusinessBase对象数据处理
环境:.net4.6+csla4.6 实现:对象的数据库访问及数据库执行使用Factory方式进行封闭. 正文: 以前在使用csla框架完成业务对象的定义时所有的数据处理都在对象内部实现,也不能说不好 ...
- CodeSmith模板代码生成实战详解
前言 公司项目是基于soa面向服务的架构思想开发的,项目分解众多子项目是必然的.然而子项目的架子结构种类也过多的话,就会对后期的开发维护产生一锅粥的感觉.为了尽可能的在结构层避免出现这种混乱的现象,我 ...
- NFine框架的T4模板
1.前言 前段时间在网上看到一个开源框架很好的.开源:ASP.NET MVC+EF6+Bootstrap开发框架,写代码就是比较比较麻烦,分层比较多,对于我这种偷懒的人就想到了写一个T4模板.不了解框 ...
- Ci框架整合smarty模板引擎
Ci框架整合smarty模板引擎 备注:下载smarty时,最好选择2.6版本,其他测试有坑,ci可以是2.2或其他 大体思路:将smarty封装成ci框架的一个类,然后重新配置一下smarty,这样 ...
- [King.yue]关于CSLA框架的一些看法
CSLA.Net 是一个有帮助的成熟开发框架,但不适于初学者.该框架支持在任何地方.任何时间创建对象,值得我们花时间去学习了解这一框架.CSLA.Net 框架设计的业务对象,支持对完全透明的数据源进行 ...
- Django框架简介及模板Template,filter
Django框架简介 MVC框架和MTV框架 MVC,全名是Model View Controller,是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model).视图(View) ...
- Spring框架的JDBC模板技术和事物
Spring框架的JDBC模板技术 技术分析之Spring框架的JDBC模板技术概述 1. Spring框架中提供了很多持久层的模板类来简化编程,使用模板类编写程序会变的简单 ...
- 解析Spring第四天(Spring中的事物、Spring框架来管理模板类)
JDBC模板技术: Spring框架中提供了很多持久层的模板类来简化编程,使用模板类编写程序会变的简单 template 模板 都是Spring框架提供XxxTemplate 提供了JDBC模板,Sp ...
随机推荐
- 四大MQ比较及MQ详解
消息队列已经逐渐成为企业IT系统内部通信的核心手段.它具有低耦合.可靠投递.广播.流量控制.最终一致性等一系列功能,成为异步RPC的主要手段之 一.当今市面上有很多主流的消息中间件,如老牌的Activ ...
- SSH框架整合截图总结(一)
分页相关属性 --------------------------------------------------------------- 分页思路表单提交(只需传递当前页的值) ->acti ...
- Oracle解除表锁定问题
1.肯定是你同时打开了多个操作页面,要记得关闭多个打开的sql窗口. 2.可以变相删除表,再重新创建一张同名的表来解除表被锁住的问题
- SSAO + FXAA
如今已经完毕了渲染器的屏幕空间环境光遮挡(SSAO)算法和FXAA高速反走样算法,等有时间就把当中的相关原理和当中遇到的问题进行总结发表.
- Cocos2d-x 动手实现游戏主循环
因为Cocos2d-x封装的非常好,所以对于非常多新手,他们仅仅知道先new一个场景,在场景上加入布景或精灵,然后用Director的runWithScene便能够执行游戏了.假设给一个精灵加个动作, ...
- 赵雅智_android获取本机运营商,手机号部分能获取
手机号码不是全部的都能获取.仅仅是有一部分能够拿到. 这个是因为移动运营商没有把手机号码的数据写入到sim卡中.SIM卡仅仅有唯一的编号.供网络与设备 识别那就是IMSI号码,手机的信号也能够说是通过 ...
- iOS-UIImageView载入网络下载的图片(异步+多线程)
最原始的载入网络下载的图片方式: //最原始载入网络图片方法,相当堵塞主线程,界面卡顿 -(void)setImageWithURL:(NSString *)imageDownloadUrl{ UII ...
- DOM基础----DOM(一)
DOM(Document Object Model),中文名称为文档对象模型.是处理可扩展标识语言的标准编程接口,主要针对HTML和XML.DOM描绘了一个层次化的节点树,开发者能够加入.改动和移除页 ...
- Bitcoin学习篇之---PPS和PPLNS挖矿模式介绍
PPS和PPLNS挖矿模式介绍 比特币每10分钟产生一个区块,会有千万人竞争.而这个区块终于仅仅归1个人全部.其他人都颗粒无收. 你或许要挖5年才干获得一个区块. 组队挖矿就是.一旦队伍里不论什么人获 ...
- FFMpeg在Windows下搭建开发环境【转】
本文转载自:http://blog.csdn.net/wootengxjj/article/details/51758621 版权声明:本文为博主原创文章,未经博主允许不得转载. FFmpeg 是一个 ...