一直有关注CSLA框架,最近闲来无事,折腾了下,在最新的r3054版本基础上修改了一些东西,以备自己用,有兴趣的园友可以下载共同研究

1、添加了默认的授权规则

如果是列表对象则生成列表权限,User的只读列表和可编辑列表生成的都是User.List权限,admin角色具有所有权限:
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
}
如果是可编辑的跟对象则生成增删改读权限,admin角色具有所有权限:
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、添加了添加修改时间,创建者修改者的自动处理

  数据库表中存在CreateAt,UpdateAt,CreateUserID,UpdateUserID时自动生成代码,在Common\AutoColunmConfig.cst模板中可以配置对应的数据库字段和读取当前用户ID的代码。UserIDAccessor配置生成当前用户ID的代码。
 <%@ Property Name="DeletedFlag" Default="DeletedFlag" Type="System.String" %>
<%@ Property Name="Create_At" Default="CreateAt" Type="System.String" %>
<%@ Property Name="Update_At" Default="UpdateAt" Type="System.String" %>
<%@ Property Name="Create_UserID" Default="CreateUserID" Type="System.String" %>
<%@ Property Name="Update_UserID" Default="UpdateUserID" Type="System.String" %>
<%@ Property Name="UserIDAccessor" Default="Csla.ApplicationContext.User == null ? (int?)null : (Csla.ApplicationContext.User.Identity as MFKIdentity).UserID" Type="System.String" %>
 

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);
}
}
}

  

注意事项:

1、表名不能以Info结尾
2、字段名不可以和Csla的业务对象的同名,例如: 字段名不能为Parent,IsDeleted 等

附:可能由于CSLA对使用者的要求相对其他框架较高,目前国内CSLA的学习社区太少,这么优秀的框架,居然国内都不火,真是可惜了,我建了个交流群,欢迎感兴趣的朋友一起来学习。

CSLA&DevExpress交流群: 367088648

 
 
 

CSLA框架的codesmith模板改造的更多相关文章

  1. DotNet 资源大全中文版,内容包括:编译器、压缩、应用框架、应用模板、加密、数据库、反编译、IDE、日志、风格指南等

    DotNet 资源大全中文版 我想很多程序员应该记得 GitHub 上有一个 Awesome - XXX 系列的资源整理.awesome-dotnet 是由 quozd 发起和维护.内容包括:编译器. ...

  2. csla框架__使用Factory方式实现Csla.BusinessBase对象数据处理

    环境:.net4.6+csla4.6 实现:对象的数据库访问及数据库执行使用Factory方式进行封闭. 正文: 以前在使用csla框架完成业务对象的定义时所有的数据处理都在对象内部实现,也不能说不好 ...

  3. CodeSmith模板代码生成实战详解

    前言 公司项目是基于soa面向服务的架构思想开发的,项目分解众多子项目是必然的.然而子项目的架子结构种类也过多的话,就会对后期的开发维护产生一锅粥的感觉.为了尽可能的在结构层避免出现这种混乱的现象,我 ...

  4. NFine框架的T4模板

    1.前言 前段时间在网上看到一个开源框架很好的.开源:ASP.NET MVC+EF6+Bootstrap开发框架,写代码就是比较比较麻烦,分层比较多,对于我这种偷懒的人就想到了写一个T4模板.不了解框 ...

  5. Ci框架整合smarty模板引擎

    Ci框架整合smarty模板引擎 备注:下载smarty时,最好选择2.6版本,其他测试有坑,ci可以是2.2或其他 大体思路:将smarty封装成ci框架的一个类,然后重新配置一下smarty,这样 ...

  6. [King.yue]关于CSLA框架的一些看法

    CSLA.Net 是一个有帮助的成熟开发框架,但不适于初学者.该框架支持在任何地方.任何时间创建对象,值得我们花时间去学习了解这一框架.CSLA.Net 框架设计的业务对象,支持对完全透明的数据源进行 ...

  7. Django框架简介及模板Template,filter

    Django框架简介 MVC框架和MTV框架 MVC,全名是Model View Controller,是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model).视图(View) ...

  8. Spring框架的JDBC模板技术和事物

    Spring框架的JDBC模板技术         技术分析之Spring框架的JDBC模板技术概述  1. Spring框架中提供了很多持久层的模板类来简化编程,使用模板类编写程序会变的简单     ...

  9. 解析Spring第四天(Spring中的事物、Spring框架来管理模板类)

    JDBC模板技术: Spring框架中提供了很多持久层的模板类来简化编程,使用模板类编写程序会变的简单 template 模板 都是Spring框架提供XxxTemplate 提供了JDBC模板,Sp ...

随机推荐

  1. Untiy中的数据平滑处理

    本文章由cartzhang编写,转载请注明出处. 所有权利保留. 文章链接:http://blog.csdn.net/cartzhang/article/details/50680237 作者:car ...

  2. 【codeforces 724E】Goods transportation

    [题目链接]:http://codeforces.com/problemset/problem/724/E [题意] 有n个城市; 这个些城市每个城市有pi单位的物品; 然后已知每个城市能卖掉si单位 ...

  3. nodejs-mysql模块

    安装mysql模块 1 npm install -g mysql node中使用Mysql模块来执行mysql命令 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 var ht ...

  4. Grand Central Dispatch(GCD)详解

    概述 GCD是苹果异步执行任务技术,将应用程序中的线程管理的代码在系统级中实现.开发者只需要定义想要执行的任务并追加到适当的Dispatch Queue中,GCD就能生成必要的线程并计划执行任务.由于 ...

  5. Android开发之使用BroadcastReceiver实现开机自己主动启动(源码分享)

    上一节已经介绍过BroadcastReceiver实现实时监听电量的功能,这节就来介绍一下假设实现开机自己主动启动的功能.这个比监听电量还简单不少 (1)在清单文件注冊权限 <uses-perm ...

  6. 上机题目(0基础)- Java网络操作-Socket实现client和server端通信(Java)

    非常多刚開始学习的人对于java网络通信不太熟悉.对相关概念也不太明确,这里我们主要实现一下socket通信,socket通信在java中应用十分广泛.比如QQ和MSN等都是基于socket通信的,什 ...

  7. USACO holstein 超时代码

    /* ID:kevin_s1 PROG:holstein LANG:C++ */第八组数据跪了.半天都不出结果 #include <iostream> #include <cstdi ...

  8. 【剑指Offer学习】【面试题26:复杂链表的复制】

    题目:请实现函数ComplexListNode clone(ComplexListNode head),复制一个复杂链表. 在复杂链表中,每一个结点除了有一个next 域指向下一个结点外,另一个sib ...

  9. JavaScript(js)对象常用操作,JS操作JSON总结

    数据类型判断可以通过一元操作符typeof,此操作符可以判断大部分JS数据类型. 也可以通过instanceof来判断.如: var a = []; alert(typeof a); // objec ...

  10. 求区间连续不超过K段的最大和--线段树+大量代码

    题目描述: 这是一道数据结构题. 我们拥有一个长度为n的数组a[i]. 我们有m次操作.操作有两种类型: 0 i val:表示我们要把a[i]修改为val; 1 l r k:表示我们要求出区间[l,r ...