文章出處

主題介紹如何啟用管理模型差異(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) 文件創建的那個,可以點擊導入共享模型差異

另外三個按鈕是:復制模型差異 導出模型差異重置模型差異應用所選記錄

模型差異列表視圖,有一條共享模型差異的記錄。它不是指某個用戶的設置,而是指應用程序全局的設置

更多信息可以看這里。 

 


文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()