本主题介绍如何启用管理模型差异(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. js的一些实用的小技巧

    1.移动端自适应: 移动端的编写首先需要在header写入以下内容来表示页面是以不缩放的形式展示的: <meta name="viewport" content=" ...

  2. ubuntu16.04部署RED5流媒体服务器

    前提:jdk已经安装 1,下载RED5(https://github.com/Red5/red5-server/releases)选择red5-server-X.X.X-MXX.tar.gz 2,解压 ...

  3. android 使用shape来优化界面效果

    看下效果图: <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android=&quo ...

  4. 【KeyCode 键码】

    Key codes returned by Event.keyCode. These map directly to a physical key on the keyboard. KeyCode是由 ...

  5. 响应式内容滑动插件jQuery.bxSlider

    bxSlider特性 1.充分响应各种设备,适应各种屏幕: 2.支持多种滑动模式,水平.垂直以及淡入淡出效果: 3.支持图片.视频以及任意html内容: 4.支持触摸滑动: 5.支持Firefox,C ...

  6. PhpStorm创建Drupal模块项目开发教程(1)

    用户体验是应用程序开发的一个重要因素.一个加载时间长.设计差.导航不清晰的网站很难留住客户. Web应用程序由多个部分组成,并且可能运行在多种环境中,所以Web应用程序从开发开始就需要在所有环境中进行 ...

  7. 【转载】Windows下VSCode编译调试c/c++

    懒得自己配置或自己配置出现不明问题的朋友可以点这里: [VSCode]Windows下VSCode便携式c/c++环境 http://blog.csdn.net/c_duoduo/article/de ...

  8. 怎样获取Windows平台下SQL server性能计数器值

    转载自工作伙伴Garrett, Helen "SQL Server Performance Counter captures" Capturing Windows Performa ...

  9. centos7安装http服务

    1.yum安装http [root@localhost ~]# yum install httpd -y 2.启动http服务 [root@localhost ~]# systemctl start  ...

  10. libevent源码分析:http-server例子

    http-server例子是libevent提供的一个简单web服务器,实现了对静态网页的处理功能. /* * gcc -g -o http-server http-server.c -levent ...