本主题介绍如何启用管理模型差异(XAFML),并将设置存储在数据库中。
 
名词解释:
1.模型:XAF中把所有应用程序的结构都用模型来定义,比如列表,有哪些列,名称是什么,对应的字段名是什么,业务对象有哪些,有哪些验证条件等等。
2.模型差异:XAF中的模型是分层次的,结果是继承过来的,低层定义的模型可以认为是公用信息,就像是基类,在派生类中做了重写。如:win和web和mobile都可以继承自基础设置。不同的语言也是可以继承自英语这个基类,在这个基础上进行翻译。
这些数据通常是在设计时组织出来的,多数是通过代码,读取一些Attribute,或是做推导而得出,在运行时,这些信息也是可以修改的,这里把运行时的结果与设计时结果的不同点叫做“模型差异”,模型差异就是个性化设置。
在XAF中对模型进行管理的功能是重量级的,除了上面说的这些,还可以有不同用户有不同的设置。
 
一、将模型差异保存到数据库中
当你在解决方案向导中创建一个新的应用程序并启用的安全系统时,默认情况下的最终用户设置 (模型差异) 存储在数据库中,将使用的 ModelDifferenceDbStore 。
这里介绍如何在现有的应用程序中启用此功能,以及如何存储在数据库中的共享的模型差异 (管理员的设置)。
注意
用户自己的个性化设置需要保存到数据库中去,再次读取时如何知道当前用户是谁呢?如果没有安全系统,则使用System.Security.Principal.WindowsIdentity.GetCurrent()的值,否是当然是可以使用系统登录用户名了。
模型差异功能支持winform和asp.net。在没有启用XAF的安全模块时,建议在winform中可以使用将模型差异保存到数据库,在asp.net中不要存储到数据库中,因为asp.net程序取到的当前用户永远是一个固定的,就是你在iis中设置的用户。
 
下面看看如何将模型差异保存到数据库中:
public sealed partial class MySolutionWindowsFormsModule : ModuleBase {
private void Application_CreateCustomModelDifferenceStore(Object sender, CreateCustomModelDifferenceStoreEventArgs e) {
e.Store = new ModelDifferenceDbStore((XafApplication)sender, typeof(ModelDifference), true, "Win");
e.Handled = true;
}
private void Application_CreateCustomUserModelDifferenceStore(Object sender, CreateCustomModelDifferenceStoreEventArgs e) {
e.Store = new ModelDifferenceDbStore((XafApplication)sender, typeof(ModelDifference), false, "Win");
e.Handled = true;
}
//...
public override void Setup(XafApplication application) {
base.Setup(application);
application.CreateCustomModelDifferenceStore += Application_CreateCustomModelDifferenceStore;
application.CreateCustomUserModelDifferenceStore += Application_CreateCustomUserModelDifferenceStore;
}
}

注意红色的代码:

1.MySolutionWindowsFormsModule  是指 你的项目.Module.Win这个project.

2.在setup中的2行代码增加事件,CreateCustomModelDifferenceStore 是指全局的模型设置信息。

3.CreateCustomUserModelDifferenceStore ,是指当前用户的模型信息。

4.e.Store = new ModelDifferenceDbStore((XafApplication)sender, typeof(ModelDifference), true, "Win"); 其中,true代表是否为全局设置,“win"代表平台,当然在web中,需要写"web"。web项目是:你的项目.Module.Web

public sealed partial class MySolutionAspNetModule : ModuleBase {
private void Application_CreateCustomModelDifferenceStore(Object sender, CreateCustomModelDifferenceStoreEventArgs e) {
e.Store = new ModelDifferenceDbStore((XafApplication)sender, typeof(ModelDifference), true, "Web");
e.Handled = true;
}
private void Application_CreateCustomUserModelDifferenceStore(Object sender, CreateCustomModelDifferenceStoreEventArgs e) {
e.Store = new ModelDifferenceDbStore((XafApplication)sender, typeof(ModelDifference), false, "Web");
e.Handled = true;
}
// ...
public override void Setup(XafApplication application) {
base.Setup(application);
application.CreateCustomModelDifferenceStore += Application_CreateCustomModelDifferenceStore;
application.CreateCustomUserModelDifferenceStore += Application_CreateCustomUserModelDifferenceStore;
}
}
注意
当处理 CreateCustomModelDifferenceStore 事件时,共享的模型差异 (管理员设置) 存储在数据库中。如果数据库记录已存在共享的模型差异,则将忽略与位于应用程序项目中的 Model.xafml 文件的更改。
要重新加载从 Model.xafml 的设置,启用管理 UI 和使用导入共享模型差异操作 (或删除"共享模型的区别"记录,并重新启动)。如果这种行为是不恰当的不处理此事件。在仅发布项目配置中处理它。

下面有介绍如何启用管理UI。

如果你使用Entity Framework, 需要在DbContext中做如下声明:

using DevExpress.Persistent.BaseImpl.EF;
// ...
public class MyDbContext : DbContext {
// ...
public DbSet<ModelDifference> ModelDifferences { get; set; }
public DbSet<ModelDifferenceAspect> ModelDifferenceAspects { get; set; }
}
 
如果是使用 XPO,可以打开 你的项目.Module.cs, 运行模块设计器(直接用vs打开就行了)、找到 ModelDifference 和 ModelDifferenceAspect这两个类型,让他包含在Exported Types中

另外,一定要确保所有用户都具有读/写访问 ModelDifference 和 ModelDifferenceAspect 类型的权限,否则有的权限模块会阻止这个行为成功执行。

下面是在代码中给权限的代码:

C#
public class Updater : ModuleUpdater {
public override void UpdateDatabaseAfterUpdateSchema() {
base.UpdateDatabaseAfterUpdateSchema(); SecuritySystemRole defaultRole = ObjectSpace.FindObject<SecuritySystemRole>(
new BinaryOperator("Name", "Default"));
if(defaultRole == null) {
defaultRole = ObjectSpace.CreateObject<SecuritySystemRole>();
// ...
defaultRole.SetTypePermissionsRecursively<ModelDifference>(
SecurityOperations.ReadWriteAccess, SecuritySystemModifier.Allow);
defaultRole.SetTypePermissionsRecursively<ModelDifferenceAspect>(
SecurityOperations.ReadWriteAccess, SecuritySystemModifier.Allow);
// The 'Create' permission is additionally required if you use the Middle Tier Application Server
defaultRole.SetTypePermissionsRecursively<ModelDifference>(
SecurityOperations.Create, SecuritySystemModifier.Allow);
defaultRole.SetTypePermissionsRecursively<ModelDifferenceAspect>(
SecurityOperations.Create, SecuritySystemModifier.Allow);
}
sampleUser.Roles.Add(defaultRole);
// ...
ObjectSpace.CommitChanges();
}
// ...
}
 
注意:使用了 SecuredObjectSpaceProvider 或创建了线程安全的XPObjectSpaceProvider 时,这个功能会有问题,因为,读取模型差异时,数据库可能是不存在的,不存在,则创建数据库,然后,线程安全的object space provider是不允许先创建再去读的。如果还是要实现这个功能,可以在XafApplication.CreateCustomModelDifferenceStore事件中做个性化设置。
 
二、启用管理UI
 
首先,将 ModelDifference_ListView显示到导航菜单中,然后你就可以管理 全局或某一用户的模型差异,包括创建模、复制、导出、重置模型差异。

在运行时,通过菜单打开模型差异管理的列表,可以看到相关的按钮。

在这里,会列出存在的用户的模型差异(用户打开一次程序后,就会保存该用户的模型差异),如果想为没有使用过程序的用户创建模型差异,可以单击创建模型差异。

如果想要加载共享的模式差异(就是在 Visual Studio (Model.xafml) 文件中创建的那个),可以点击导入共享模型差异

另外三个按钮是:复制模型差异 导出模型差异重置模型差异 ,将应用于所选记录。

在模型的差异列表视图中,有一条共享模型差异的记录。它不是指某个用户的设置,而是指应用程序全局的设置。

更多信息可以看这里。

XAF:如何让用户在运行时个性化界面并将个性化信息保存到数据库中 win/web/entityframework/xpo的更多相关文章

  1. XAF实现运行时填加验证规则并保存到数据库中

    有几种方法可以用来声明一个验证规则.最常用的方法是使用对应的Attribute来定义.详见这里.验证模块还允许您通过在业务类实现 IRuleSource 接口定义自定义的验证规则的来源. IRuleS ...

  2. iOS crash log 解析 symbol address = stack address - slide 运行时获取slide的api 利用dwarfdump从dsym文件中得到symbol

    概述: 为什么 crash log 内 Exception Backtrace 部分的地址(stack address)不能从 dsym 文件中查出对应的代码? 因为 ASLR(Address spa ...

  3. 【Python】【demo实验1】【Python运行时强制刷新缓冲区,输出信息】(Python3 应不存在类似情况)

    [原文] 需求:打印一颗 ”*” 休息1s 代码如下: #!/usr/bin/python #coding=utf-8 ''' 暂停1s输出 ''' import time def printStar ...

  4. Java虚拟机及运行时数据区

    1.Java虚拟机的定义 Java虚拟机(Java Virtual Machine),简称JVM.当我们说起Java虚拟机时,可能指的是如下三种不同的东西: 抽象的虚拟机规范 规范的具体实现 一个运行 ...

  5. Objective-C Runtime 运行时之四:Method Swizzling

    理解Method Swizzling是学习runtime机制的一个很好的机会.在此不多做整理,仅翻译由Mattt Thompson发表于nshipster的Method Swizzling一文. Me ...

  6. Mysql常用show命令,show variables like xxx 详解,mysql运行时参数

    MySQL中有很多的基本命令,show命令也是其中之一,在很多使用者中对show命令的使用还容易产生混淆,本文汇集了show命令的众多用法. 详细: http://dev.mysql.com/doc/ ...

  7. Objective-C Runtime 运行时之四:Method Swizzling(转载)

    理解Method Swizzling是学习runtime机制的一个很好的机会.在此不多做整理,仅翻译由Mattt Thompson发表于nshipster的Method Swizzling一文. Me ...

  8. Java 9 揭秘(7. 创建自定义运行时映像)

    Tips 做一个终身学习的人. 在第一章节中,主要介绍以下内容: 什么是自定义运行时映像和JIMAGE格式 如何使用jlink工具创建自定义的运行时映像 如何指定命令名称来运行存储在自定义映像中的应用 ...

  9. 解读JavaScript 之引擎、运行时和堆栈调用

    转载自开源中国 译者:Tocy, 凉凉_, 亚林瓜子, 离诌 原文链接 英文原文:How JavaScript works: an overview of the engine, the runtim ...

随机推荐

  1. SqlServer数据库空间使用情况常用命令

    --最简单的办法就是使用SSM客户端,报表查看 --查询数据文件的空间情况 dbcc showfilestats --查询日志文件的空间情况 dbcc sqlperf(logspace) --查询te ...

  2. 笔记——shell脚本学习指南

    <shell脚本学习指南>机械工业出版 ISBN 987-7-111-25504-8 第2章 2.4 初级陷阱 1.当今的系统,对#!这一行的长度限制从63到1024个字符都有,尽量不要超 ...

  3. 相似度分析,循环读入文件(加入了HanLP,算法第四版的库)

    相似度分析的,其中的分词可以采用HanLP即可: http://www.open-open.com/lib/view/open1421978002609.htm /****************** ...

  4. HTML5元素、属性和格式化

  5. paper 129 : 比较好的开源人脸识别软件

    1.face.com 以色列公司,某年六月时被Facebook收购,同时暂停了API服务,之前测试过他们的服务,基本上是了解到的应用中做得最牛的了. 2.orbe Orbeus由麻省理工学院和波士顿大 ...

  6. html5,增加flash插件

    <embed src="2.swf" type="" width="500" height="" >< ...

  7. PhpStorm设置编码

    PhpStorm是一个轻量级且便捷的PHP IDE,其旨在提供用户效率,可深刻理解用户的编码,提供智能代码补全,快速导航以及即时错误检查. 本文为大家讲解的是如何设置phpstorm 编辑器的编码,感 ...

  8. Warning: Using a password on the command line interface can be insecure.解决办法

    被一个小朋友问到,直接公布答案: If your MySQL client/server version is a 5.6.x a way to avoid the WARNING message a ...

  9. PLSQL Developer导入Excel数据

    LSQL Developer导入Excel数据 最近处理将Excel数据导入Oracle的工作比较多.之前都是采用Sqlldr命令行导入的方式处理.每次导入不同格式的Excel表数据,都需要先把Exc ...

  10. If you only do what you can do you'll never be more than you are now.

    If you only do what you can do you'll never be more than you are now. 如果你只是做你力所能及的事,你将不会有所进步: