搭建Wpf框架(4) —— Wpf使用EFCore操作數據庫


前言:1.一般情況下客戶端不會直接操作數據庫,但是一些比較小型的應用也是可以的。

   2.另外本地一般會用SQLite做本地數據緩存,所以集成一個ORM還是有必要的。

本框架之前是用Web API獲取數據,現在將API切換到EFCore直接連接數據庫獲取數據。

之前的架構圖:

 

 

現在的框架

 

基礎部分不用動,只用重新對接一些Business層即可。

之前頁面層獲取數據的方法為 

 var result = await _dataProvider.GetData<List<SelectOption>>($"/Base_Manage/Base_UserLog/GetLogTypeList");

  方法不用變,在di注入的時候,選擇不同的dataProvider即可

  //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。

      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) 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM