新建一个 面向目标 net5 的基础 XAF 项目(Win或者Blazor,不带安全的身份认证与授权)
一、新建
新建一个 面向目标 net5 的 XAF 项目(Win或者Blazor),会产生三个项目,其中一个主项目(启动项目),另两个是库项目,被主项目引用。其中一个可重用于同种项目类型,命名:XXXX.Module.
面向 net5 的 XAF 项目,已经不支持 Access 数据库,主要是 XPO 没有相应 的数据驱动引擎。微软官方EFCore 也不支持了,只有 SQL Server 、SQLite、Inmemory 等的驱动支持。参考:https://docs.microsoft.com/zh-cn/ef/core/providers/?tabs=dotnet-core-cli , 虽然有非官方的Access驱动Nuget包(https://www.nuget.org/packages/EntityFrameworkCore.Jet/) .
但 XPO 没有相应的升级,官方文档找不到参考: https://docs.devexpress.com/XPO/2114/product-information/database-systems-supported-by-xpo?p=netstandard。 可以考虑用:SQLite 代替。
新建的项目,如果没有选择扩展模块,或者安全认证等功能,在数据库中只生成了一个表: XPObjectType
二、补增
在已经有项目的基础上,补充新项目(右健解决方案,选择:Add Devexpress Item \ New Project),可以有三种项目选择。1)可重用模块库, 2)Winform 项目 3)Blazor 项目。 后两个选择,又会自动产生 两个项目(一个库项目、一个主体项目)。
三、主体项目 application 主要文件解释
appsettings.json 或 App.config 项目参数配置用,如数据库链接字符串 ConnectionString。
Model.xafml 模型自定义配置用
XXXXWindowsFormsApplication / XXXXBlazorApplication
(继续于 BlazorApplication.cs 或 WinApplication.cs ,又继续于:抽象类 XafApplication )
Program.cs (及 Startup.cs)、 系统启动入口,配置入口
1、Win系统启动时,会创建(new)一个 XXXXWindowsFormsApplication 实例 winApplication,
设置实例: ConnectionString,DatabaseUpdateMode(调试时)
实例然后: winApplication.Setup(); winApplication.Start();
2、Blazor 系统启动,按启动参数是否有:help、updateDatabase(forceUpdate、silent选项) 进行,
然后 使用 Startup 构建 Host。
Startup 类服务配置,除了 services.AddRazorPages(); services.AddServerSideBlazor();
重点如下: services.AddHttpContextAccessor();
services.AddSingleton<XpoDataStoreProviderAccessor>();
services.AddScoped<CircuitHandler, CircuitHandlerProxy>();
services.AddXaf<XXXXBlazorApplication>(Configuration); 难点: Scoped 或 Singleton ?
后面还有:app.UseXaf() ; 这是一个中间件!
3、XXXXWindowsFormsApplication 是核心
初始化 InitializeComponent() ,增加 四个基础模块(module1 ~ 4,SystemModule、SystemWindowsFormsModule、2个引用项目),绑定下列2个事件委托。
override方法 CreateDefaultObjectSpaceProvider(CreateCustomObjectSpaceProviderEventArgs args)
自定义两个 ObjectSpaceProvider
事件委托 : XXXXWindowsFormsApplication_CustomizeLanguagesList(object sender, CustomizeLanguagesListEventArgs e)
XXXXWindowsFormsApplication_DatabaseVersionMismatch(object sender, DevExpress.ExpressApp.DatabaseVersionMismatchEventArgs e)
4、 XXXXBlazorApplication 是核心
初始化 InitializeComponent() ,增加 四个 基础模块(module1 ~ 4,2个系统模块 SystemModule、SystemBlazorModule,2个引用项目模块),绑定下列 1 个事件委托。
override 方法 OnSetupStarted() 配置属性:ConnectionString、 DatabaseUpdateMode
override方法 CreateDefaultObjectSpaceProvider(CreateCustomObjectSpaceProviderEventArgs args)
自定义两个 ObjectSpaceProvider
事件委托 : XXXXBlazorApplication_DatabaseVersionMismatch(object sender, DevExpress.ExpressApp.DatabaseVersionMismatchEventArgs e)
四、主体项目通过代码增加模块(Module)
1、XafApplication 的继承者都有 Modules 属性
初始化时增加:
public XXWindowsFormsApplication() / XXBlazorApplication() {
InitializeComponent();
this.Modules.Add( new MyCustomModule.CustomModule());
//下列仅限于 WinForm 类
SplashScreen = new DXSplashScreen(typeof(XafSplashScreen), new DefaultOverlayFormOptions()); }
2、 App.config 配置有模块,调用 XafApplication 继承者 的 Setup 重载方法
App.config 配置中可有:
<appSettings>
<add key="Modules" value="MySolution.MyCustomModule" />
</appSettings>
XXwinApplication.Setup("MySolution", winApplication.ConnectionString, ConfigurationManager.AppSettings["Modules"].Split(';'));
注意:所有模块必须在 XafApplication.Setup 方法调用前/中完成.
五、模块(Module)项目主要文件解释
Model.DesignedDiffs.xafml 模型自定义配置用
Module.cs / BlazorModule / WinModule.cs 模块定义文件,成对,另一个(XXXX.Designer.cs),
继承于: ModuleBase ,属性:RequiredModuleTypes、AdditionalExportedTypes、AdditionalControllerTypes 等
模块定义涉及: 以前有可视化设计器,所以模块都有两个分部类 partial 组成,且 Sealed。
构造初始化: InitializeComponent(); 增加引用的模块,增加输出类。------ 这里增加引用模块
this.AdditionalExportedTypes.Add(typeof(XX.HCategory)); ------ 仅限于平台无关项目(业务类)
this.RequiredModuleTypes.Add (typeof(XX.SystemModule));
重写方法:
public override IEnumerable<ModuleUpdater> GetModuleUpdaters(IObjectSpace objectSpace, Version versionFromDB)
public override void Setup(XafApplication application)
public override void CustomizeTypesInfo(ITypesInfo typesInfo)