CSLA框架的codesmith模板改造

一直有关注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[0].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 = 0; 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 == 0)
throw new DBConcurrencyException("您提交的数据已过期,请刷新您的界面后重试.");
else
Result = true;
}
}

}

#endregion
}

5、添加了软删除的功能


当数据表中有一列名为bit类型的IsDeleted(默认值为0,not
null)时,自动启用软删除,即执行对象的删除操作时并不是从数据库中删除对象,而是设置IsDeleted字段为1,使用criteria条件查询时,除非指定显式设置IsDeleted属性值,否则默认按照IsDeteted<>1查询,即已经删除的记录不会查出来,就像真的被从数据库中删除了一样。

修改后的模板下载

备注下:博客园写文章好费劲,还是用Evernote吧

时间: 2024-10-12 15:45:59

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

NetworkComms网络通信框架配套CodeSmith模板使用简介

NetworkComms网络通信框架配套CodeSmith模板使用简介 NetworkComms网络通信程序开发过程中,与数据库的交互部分,很多代码我们采用CodeSmith模板来生成. 此套CodeSmith模板目前只支持sql server 数据库 模板下载地址:  [模板下载]分享我所使用的数据库框架 我们以Sql server数据库为例 简单的看一下如何使用CodeSmith模板生成相关文件 首先双击打开模板文件 第二步:打开属性窗口 数据库配置完成后 ,选择相应的表 生成的代码如下:

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

环境:.net4.6+csla4.6 实现:对象的数据库访问及数据库执行使用Factory方式进行封闭. 正文: 以前在使用csla框架完成业务对象的定义时所有的数据处理都在对象内部实现,也不能说不好,对象很大.作者给了通过Factory的方式将对象的数据访问层进行分离,代码更容易维护.以下是我通过Factory的方式实现对象数据访问. 首先是通过csla的约定定义业务对象,其中包含了属性验证: 1 [Serializable] 2 [Csla.Server.ObjectFactory("HFu

CodeSmith模板代码生成实战详解

前言 公司项目是基于soa面向服务的架构思想开发的,项目分解众多子项目是必然的.然而子项目的架子结构种类也过多的话,就会对后期的开发维护产生一锅粥的感觉.为了尽可能的在结构层避免出现这种混乱的现象,我们就做了一个决定,使用一个统一的架子结构,让项目管理变的简单起来. 这样一来,结构中各层就会有很多重复的代码或者重复的逻辑出现,为啦提高开发效率,节约开发时间,我们采用了codesmith根据自定义模板,生成代码功能.让单表的增删改查功能从数据访问层到ui展示层一键批量生成.下面就开始我的codeS

Django框架简介及模板Template

Django框架简介 MVC框架和MTV框架 MVC,全名是Model View Controller,是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model).视图(View)和控制器(Controller),具有耦合性低.重用性高.生命周期成本低等优点. 想要更详细的了解MVC模式? >> 点我 Django框架的设计模式借鉴了MVC框架的思想,也是分成三部分,来降低各个部分之间的耦合性. Django框架的不同之处在于它拆分的三部分为:Model(模型).Templ

springMVC框架集成tiles模板

将tiles模板集成到springMVC框架下,大概流程如下: 1.在配置文件中加入tiles支持 我的servlet配置文件名为spring-mvc.xml.具体配置如下: <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.

Javascript库,前端框架(UI框架),模板引擎

JavaScript库:JQuery,undoscore,Zepto 纯Javascript语言封装, 前端框架(UI框架):Bootstrap,Foundation,Semantic UI,Pure.css 前端框架.UI框架,或者叫UI模板 HTML + CSS + (JavaScript)? 模板引擎: 叫HTML模板引擎?  模板文件(HTML)+(CSS)?+数据(JSON) =输入=> 模板引擎  =输出=>HTML (客户端)前端模板引擎(渲染),(服务器)后端模板引擎(渲染)

MVC+BootStrap 企业通用型框架搭建 ---(2)框架布局及模板页的创建

模板页面介绍 _Header.cshtml头部页面 ,_Footer.cshtml底部页面 ,Main.cshtml框架主页面, _Theme.cshtml(主题页面),_Menu.cshtml(左侧菜单页面),_Style.cshtml(通用样式页面) _Header.cshtml 代码: @{ ViewBag.Title = "_Header";}<script type="text/ecmascript"> $(function () { $(&q

MVC+BootStrap 企业通用型框架搭建 ---(1)框架布局及模板页的创建

本系统使用的ui框架是Bootstrap3.0 布局是使用mvc的模板页面:分[左侧菜单栏目],头部[个人信息任务栏目],尾部[公司信息简介栏目],三大块: 系统搭建:(1)ManagerSystem.DI(控制反转层),ManagerSystem.UI(MVC UI层),ManagerSystem.Utility(通用工具类),SqlServer.BLL(通用业务层),SqlServer.IBLL(父业务层),SqlServer.DAL(数据层), SqlServer.IDAL(父数据层);

NodeJS框架Express的模板视图机制

MVC模式可谓无人不知,它除了能增强团队协作的效率,还可方便产品的维护升级,本文我们将对Express框架的模板和视图(V)相关功能进行介绍. 模板引擎 Express支持许多模板引擎,常用的有: haml 的实现Haml haml.js 接替者,同时也是Express的默认模板引擎Jade 嵌入JavaScript模板EJS 基于CoffeeScript的模板引擎CoffeeKup 的NodeJS版本jQuery模板引擎 视图渲染(view randering) 视图的文件名默认需遵循"<