本主题介绍如何启用管理模型差异(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中设置的用户。
 
下面看看如何将模型差异保存到数据库中:
  1. public sealed partial class MySolutionWindowsFormsModule : ModuleBase {
  2. private void Application_CreateCustomModelDifferenceStore(Object sender, CreateCustomModelDifferenceStoreEventArgs e) {
  3. e.Store = new ModelDifferenceDbStore((XafApplication)sender, typeof(ModelDifference), true, "Win");
  4. e.Handled = true;
  5. }
  6. private void Application_CreateCustomUserModelDifferenceStore(Object sender, CreateCustomModelDifferenceStoreEventArgs e) {
  7. e.Store = new ModelDifferenceDbStore((XafApplication)sender, typeof(ModelDifference), false, "Win");
  8. e.Handled = true;
  9. }
  10. //...
  11. public override void Setup(XafApplication application) {
  12. base.Setup(application);
  13. application.CreateCustomModelDifferenceStore += Application_CreateCustomModelDifferenceStore;
  14. application.CreateCustomUserModelDifferenceStore += Application_CreateCustomUserModelDifferenceStore;
  15. }
  16. }

注意红色的代码:

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

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

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

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

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

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

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

  1. C#
  2. public class Updater : ModuleUpdater {
  3. public override void UpdateDatabaseAfterUpdateSchema() {
  4. base.UpdateDatabaseAfterUpdateSchema();
  5.  
  6. SecuritySystemRole defaultRole = ObjectSpace.FindObject<SecuritySystemRole>(
  7. new BinaryOperator("Name", "Default"));
  8. if(defaultRole == null) {
  9. defaultRole = ObjectSpace.CreateObject<SecuritySystemRole>();
  10. // ...
  11. defaultRole.SetTypePermissionsRecursively<ModelDifference>(
  12. SecurityOperations.ReadWriteAccess, SecuritySystemModifier.Allow);
  13. defaultRole.SetTypePermissionsRecursively<ModelDifferenceAspect>(
  14. SecurityOperations.ReadWriteAccess, SecuritySystemModifier.Allow);
  15. // The 'Create' permission is additionally required if you use the Middle Tier Application Server
  16. defaultRole.SetTypePermissionsRecursively<ModelDifference>(
  17. SecurityOperations.Create, SecuritySystemModifier.Allow);
  18. defaultRole.SetTypePermissionsRecursively<ModelDifferenceAspect>(
  19. SecurityOperations.Create, SecuritySystemModifier.Allow);
  20. }
  21. sampleUser.Roles.Add(defaultRole);
  22. // ...
  23. ObjectSpace.CommitChanges();
  24. }
  25. // ...
  26. }
 
注意:使用了 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. Java学习笔记,第三章

    Java基础语法 3.1类型.变量与运算符 3.1.1类型 Java可分为基本类型和类类型或参考类型.基本类型主要有 整数:可分为short整数(2字节,-32768 -- 32767),int整数( ...

  2. Linux(ubanto):可以ping通IP,但不能ping通域名

    打开/etc/resolv.conf文件 vi /etc/resolv.conf 插入一下两行保存即可 nameserver 8.8.8.8 nameserver 8.8.4.4

  3. C#操作Mongodb的心得

    Mongodb是一个强大的文档型数据库,采用BSON的数据格式.本文主要采用其官方的C#驱动来操作其表中的集合.驱动版本为1.1.0,下载地址为: http://mongodb.github.io/m ...

  4. Leetcode: Count The Repetitions

    Define S = [s,n] as the string S which consists of n connected strings s. For example, ["abc&qu ...

  5. nginx----------------环境搭建遇到的一些问题汇总--(多域名配置,配置文件修改问题)

    nginx的启动命令是:(通用) /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf 重启命令: /usr/local/ng ...

  6. 第二天 ado.net, asp.net ,三层笔记

    1. ado.net步骤:     一:倒入命名空间      using System.Data;      using System.Data.sqlclient;     二:第一个模型 int ...

  7. STL—Vector简介

    有关C++ STL 中的vector向量的用法(代码示例) 一. 简介 Vector是一个称为向量的顺序容器(不明白顺序容器与关联容器的可以Google). 二. 特点 1. 动态(相当于一个动态数组 ...

  8. JAVA用途

    在现今阶段,最有前途的开发语言当属Java,Java语言是跨平台的,Write Once,Run Anywhere是Java的一句口号,学Application编程,可以在计算机上写程序,学Apple ...

  9. 归并排序算法 java 实现

    归并排序算法 java 实现 可视化对比十多种排序算法(C#版) [直观学习排序算法] 视觉直观感受若干常用排序算法 算法概念 归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Di ...

  10. c# 如何隐藏TabControl控件的标签

    http://www.cnblogs.com/chenleiustc/archive/2009/11/25/1527813.html 方法一:将标签缩小到机会看不到:设置页面的大小模式会自动适合(会尽 ...