搭建Wpf框架(4) —— Wpf使用EFCore操作数据库
AIStudio框架汇总及介绍
前言:1.一般情况下客户端不会直接操作数据库,但是一些比较小型的应用也是可以的。
2.另外本地一般会用SQLite做本地数据缓存,所以集成一个ORM还是有必要的。
本框架之前是用Web API获取数据,现在将API切换到EFCore直接连接数据库获取数据。
之前的架构图:
现在的框架
基础部分不用动,只用重新对接一些Business层即可。
之前页面层获取数据的方法为
1 | var result = await _dataProvider.GetData<List<SelectOption>>($ "/Base_Manage/Base_UserLog/GetLogTypeList" ); |
方法不用变,在di注入的时候,选择不同的dataProvider即可
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | //api接口模式 if (LocalSetting.ApiMode) { container.AddNewExtension<Interception>() //add Extension Aop .RegisterSingleton<IDataProvider, ApiDataProvider>( new Interceptor<InterfaceInterceptor>(), new InterceptionBehavior<PolicyInjectionBehavior>()); } else //直接访问数据库模式,目前只实现了SqlServer,SQLite { container.AddNewExtension<Interception>() //add Extension Aop .RegisterType( typeof (IDataProvider), typeof (EFCoreDataProvider), new Interceptor<InterfaceInterceptor>(), new InterceptionBehavior<PolicyInjectionBehavior>()); containerRegistry.AddEFCoreServices(); //初始化数据 SeedData.EnsureSeedData(); } |
另外之前的路由解析(/Base_Manage/Base_UserLog/GetLogTypeList)是由服务解析。
现在为了不改变应用层,那么在EFCoreDataProvider解析参数,并用反射对应的business。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 | public async Task<WebResponse<T>> GetData<T>( string url, string json) { try { //url固定是三段,例:Base_Manage/Base_Role/GetOptionList var paras = url.Split( new string [] { @"/" }, StringSplitOptions.RemoveEmptyEntries); //第一段暂时可以 //第二段对应不用的business var type = EFCoreDataProviderExtension.AllTypes.FirstOrDefault(p => p.Name == $ "I{paras[1]}Business" ); if (type == null ) return WebResponse<T>.Failed(( int )ResponseCode.CLIENT_EXCEPTION, "暂不支持" ); //获取接口 var business = ContainerLocator.Current.Resolve(type); if (business == null ) return WebResponse<T>.Failed(( int )ResponseCode.CLIENT_EXCEPTION, "暂不支持" ); //第三段为函数,根据名称获取方法 Task task; MethodInfo methodInfo = business.GetType().GetMethod($ "{paras[2]}Async" ); var para = methodInfo.GetParameters()?.FirstOrDefault(); if (para != null ) { var data = JsonConvert.DeserializeObject(json, para.ParameterType); task = methodInfo.Invoke(business, new Object[] { data }) as Task; } else { task = methodInfo.Invoke(business, new Object[] { }) as Task; } await task; //获取执行结果 var response = task.GetType().GetProperty( "Result" ).GetValue(task, null ); if (response is AjaxResult) //解析分页数据 { var pageResult = (response as AjaxResult).ChangeType<AjaxResult<T>>(); return WebResponse<T>.Success(pageResult.Data, pageResult.Total); } else if (response is T result) //直接解析数据 { return WebResponse<T>.Success(result, 1); } else //解析数据(强制转换) { return WebResponse<T>.Success(response.ChangeType<T>(), 1); } } catch (Exception ex) { return WebResponse<T>.Failed(( int )ResponseCode.CLIENT_EXCEPTION, ex.ToString()); } } |
databusiness的实现是将后台的control和business迁移过来的合并的,DataRepository是直接迁移的(从EFCore.Sharding拷贝了一点实现的,大家可以直接看EFCore.Sharding源码,如果是初学者,我这是简单裁剪版,比较容易懂),直接拷贝到任何工程都可以直接使用。
配置文件App.config:
<!--<add key="ServerIP" value="http://121.36.12.76:5000"/>-->
<add key="UpdateAddress" value="http://121.36.12.76:5000/Update/AutoUpdater.xml"/>
<add key="ConString" value="Data Source=Admin.db"/>
<add key="DatabaseType" value="SQLite"/>
<add key="DeleteMode" value="Logic"/>
取消ServerIP的注释,那么为API获取数据模式,数据从http://121.36.12.76:5000取
注释掉ServerIP,那么是使用efcore获取数据,改变ConString和DatabaseType即可。另外,默认数据库删除模式为软删除。
最后源码地址:艾竹/AIStudio.Wpf.AClient (gitee.com)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· AI与.NET技术实操系列(六):基于图像分类模型对图像进行分类