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

主题介绍如何启用管理模型差异(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) 文件创建的那个,可以点击导入共享模型差异

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

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

更多信息可以看这里。 

 

原文地址:https://www.cnblogs.com/foreachlife/p/xafmlruntimeui.html