【無私分享:從入門到精通ASP.NET MVC】從0開始,一起搭框架、做項目 (15)源碼分享一:修改倉儲IRepository、RepositoryBase

来源:http://www.cnblogs.com/yuangang/archive/2016/08/08/5748506.html
-Advertisement-
Play Games

聲明:本系列為原創,分享本人現用框架,未經本人同意,禁止轉載!http://yuangang.cnblogs.com 希望大家好好一步一步做,所有的技術和項目,都毫無保留的提供,希望大家能自己跟著做一套,還有,請大家放心,只要大家喜歡,有人需要,絕對不會爛尾,我會堅持寫完~ 如果你感覺文章有幫助,點 ...


聲明:本系列為原創,分享本人現用框架,未經本人同意,禁止轉載!http://yuangang.cnblogs.com

希望大家好好一步一步做,所有的技術和項目,都毫無保留的提供,希望大家能自己跟著做一套,還有,請大家放心,只要大家喜歡,有人需要,絕對不會爛尾,我會堅持寫完~

如果你感覺文章有幫助,點一下推薦,讓更多的朋友參與進來,也是對本人勞動成果的鼓勵,謝謝大家!由於還要工作,所以基本都是犧牲午休時間來寫博客的,寫博客呢不是簡單的Ctrl+C、Ctrl+V,我是要挨著做一遍的,這也是對大家負責,所以有些時候更新不及時,或者問題沒有及時解答,希望大家諒解,再次感謝大家!!

因為我引用了許多以前積累的類庫,所以有些東西是重覆的(後來更新),有些東西是過時的,包括我寫的代碼,希望大家不要純粹的複製,取其精華去其糟粕>_<。

索引

【無私分享:從入門到精通ASP.NET MVC】從0開始,一起搭框架、做項目 目錄索引

簡述

 

前言:

 

從今天開始,我們逐步把修正前後的源碼分享給大家,還是百度網盤分享,百度網盤只發兩次,兩次都失效後,請大家互相傳遞。

發送方式還是按樓層:推薦 + 周一、周三、周五、周日:單號樓層;周二、周四、周六:雙號樓層。

資料庫,已經在上一章發佈完成的項目中給大家了,這裡不再重覆發送資料庫。

今天,分享的是修改前後的倉儲IRepository、RepositoryBase

 

 

修改前弊端:

 

  如果大家仔細看過之前的倉儲IRepository、RepositoryBase,那麼大家肯定會發現,這個類無論是在效率上還是邏輯上,還是有很多不合適、不合理的。我本來是想在 【無私分享:ASP.NET CORE 項目實戰】目錄索引 系列中逐步修改,但是經過再三考慮,如果把這個源碼直接給大家,對於剛接觸的朋友實在是太不負責任,容易產生誤導,所以,還是要在這裡進行修正。

  在【無私分享:ASP.NET CORE 項目實戰(第五章)】Repository倉儲 UnitofWork 這篇文章中,簡單介紹了一下個人對於UnitOfWrok的理解,雖然 EF 是自帶事務的,但是我們的 Context.SaveChanges() 無疑拋棄了統一的事務,同時,作為一個封裝的倉儲類,我們是應該提供 串列和並行 兩種方式的,至於到底用不用非同步方式,這個我們不能泛濫,非同步不是沒有損耗的,我們只是提供兩種方式,到底用什麼,要根據業務需要調用,而不是一味的非同步方式,所有的東西都是過無不及。

 

修正一:添加UnitOfWork

 

  這是我們之前的Service 類庫:

  

 

 

 

我們添加 IUnitOfWork 介面 和 UnitOfWork 實現類

 1 namespace Service
 2 {
 3     public interface IUnitOfWork
 4     {
 5         /// <summary>
 6         /// 提交
 7         /// </summary>
 8         /// <returns></returns>
 9         bool Commit();
10 16     }
17 }
 1     public class UnitOfWork : IUnitOfWork, IDisposable
 2     {
 3         #region 數據上下文
 4 
 5         private DbContext context = new MyConfig().db;
 6         /// <summary>
 7         /// 數據上下文
 8         /// </summary>
 9         public DbContext _Context
10         {
11             get
12             {
13                 context.Configuration.ValidateOnSaveEnabled = false;
14                 return context;
15             }
16         }
17 
18         #endregion
19 
20         /// <summary>
21         /// 提交
22         /// </summary>
23         /// <returns></returns>
24         public bool Commit()
25         {
26             return _Context.SaveChanges() > 0;
27         }
28 
29         public void Dispose()
30         {
31             if (_Context != null)
32             {
33                 _Context.Dispose();
34             }
35             GC.SuppressFinalize(this);
36         }
37     }

 

 

修正二:修改IRepository

 

首先,把涉及到事務的沒用都刪掉:

 

 

修改單模型CRUD操作:①、增加非同步方式 ②、添加 bool IsCommit = true 參數,判斷是否提交

這個參數的主要作用是,我們在進行單項操作的時候,可以直接提交保存,當進行多項操作的時候,我們這個傳入False,然後 通過 UnitOfWork 統一提交保存

 1  #region 單模型 CRUD 操作
 2         /// <summary>
 3         /// 增加一條記錄
 4         /// </summary>
 5         /// <param name="entity">實體模型</param>
 6         /// <param name="IsCommit">是否提交(預設提交)</param>
 7         /// <returns></returns>
 8         bool Save(T entity, bool IsCommit = true);
 9         /// <summary>
10         /// 增加一條記錄(非同步方式)
11         /// </summary>
12         /// <param name="entity">實體模型</param>
13         /// <param name="IsCommit">是否提交(預設提交)</param>
14         /// <returns></returns>
15         Task<bool> SaveAsync(T entity, bool IsCommit = true);
16 
17         /// <summary>
18         /// 更新一條記錄
19         /// </summary>
20         /// <param name="entity">實體模型</param>
21         /// <param name="IsCommit">是否提交(預設提交)</param>
22         /// <returns></returns>
23         bool Update(T entity, bool IsCommit = true);
24         /// <summary>
25         /// 更新一條記錄(非同步方式)
26         /// </summary>
27         /// <param name="entity">實體模型</param>
28         /// <param name="IsCommit">是否提交(預設提交)</param>
29         /// <returns></returns>
30         Task<bool> UpdateAsync(T entity, bool IsCommit = true);
31 
32         /// <summary>
33         /// 增加或更新一條記錄
34         /// </summary>
35         /// <param name="entity">實體模型</param>
36         /// <param name="IsSave">是否增加</param>
37         /// <param name="IsCommit">是否提交(預設提交)</param>
38         /// <returns></returns>
39         bool SaveOrUpdate(T entity, bool IsSave, bool IsCommit = true);
40         /// <summary>
41         /// 增加或更新一條記錄(非同步方式)
42         /// </summary>
43         /// <param name="entity">實體模型</param>
44         /// <param name="IsSave">是否增加</param>
45         /// <param name="IsCommit">是否提交(預設提交)</param>
46         /// <returns></returns>
47         Task<bool> SaveOrUpdateAsync(T entity, bool IsSave, bool IsCommit = true);        
48         
49         #endregion

 

修改多模型操作,同時增加非同步方式:

  1  #region 多模型操作
  2         /// <summary>
  3         /// 增加多條記錄,同一模型
  4         /// </summary>
  5         /// <param name="T1">實體模型集合</param>
  6         /// <param name="IsCommit">是否提交(預設提交)</param>
  7         /// <returns></returns>
  8         bool SaveList(List<T> T1, bool IsCommit = true);
  9         /// <summary>
 10         /// 增加多條記錄,同一模型(非同步方式)
 11         /// </summary>
 12         /// <param name="T1">實體模型集合</param>
 13         /// <param name="IsCommit">是否提交(預設提交)</param>
 14         /// <returns></returns>
 15         Task<bool> SaveListAsync(List<T> T1, bool IsCommit = true);
 16 
 17         /// <summary>
 18         /// 增加多條記錄,獨立模型
 19         /// </summary>
 20         /// <param name="T1">實體模型集合</param>
 21         /// <param name="IsCommit">是否提交(預設提交)</param>
 22         /// <returns></returns>
 23         bool SaveList<T1>(List<T1> T, bool IsCommit = true) where T1 : class;
 24         /// <summary>
 25         /// 增加多條記錄,獨立模型(非同步方式)
 26         /// </summary>
 27         /// <param name="T1">實體模型集合</param>
 28         /// <param name="IsCommit">是否提交(預設提交)</param>
 29         /// <returns></returns>
 30         Task<bool> SaveListAsync<T1>(List<T1> T, bool IsCommit = true) where T1 : class;
 31 
 32         /// <summary>
 33         /// 更新多條記錄,同一模型
 34         /// </summary>
 35         /// <param name="T1">實體模型集合</param>
 36         /// <param name="IsCommit">是否提交(預設提交)</param>
 37         /// <returns></returns>
 38         bool UpdateList(List<T> T1, bool IsCommit = true);
 39         /// <summary>
 40         /// 更新多條記錄,同一模型(非同步方式)
 41         /// </summary>
 42         /// <param name="T1">實體模型集合</param>
 43         /// <param name="IsCommit">是否提交(預設提交)</param>
 44         /// <returns></returns>
 45         Task<bool> UpdateListAsync(List<T> T1, bool IsCommit = true);
 46 
 47         /// <summary>
 48         /// 更新多條記錄,獨立模型
 49         /// </summary>
 50         /// <param name="T1">實體模型集合</param>
 51         /// <param name="IsCommit">是否提交(預設提交)</param>
 52         /// <returns></returns>
 53         bool UpdateList<T1>(List<T1> T, bool IsCommit = true) where T1 : class;
 54         /// <summary>
 55         /// 更新多條記錄,獨立模型(非同步方式)
 56         /// </summary>
 57         /// <param name="T1">實體模型集合</param>
 58         /// <param name="IsCommit">是否提交(預設提交)</param>
 59         /// <returns></returns>
 60         Task<bool> UpdateListAsync<T1>(List<T1> T, bool IsCommit = true) where T1 : class;
 61 
 62         /// <summary>
 63         /// 刪除多條記錄,同一模型
 64         /// </summary>
 65         /// <param name="T1">實體模型集合</param>
 66         /// <param name="IsCommit">是否提交(預設提交)</param>
 67         /// <returns></returns>
 68         bool DeleteList(List<T> T1, bool IsCommit = true);
 69         /// <summary>
 70         /// 刪除多條記錄,同一模型(非同步方式)
 71         /// </summary>
 72         /// <param name="T1">實體模型集合</param>
 73         /// <param name="IsCommit">是否提交(預設提交)</param>
 74         /// <returns></returns>
 75         Task<bool> DeleteListAsync(List<T> T1, bool IsCommit = true);
 76 
 77         /// <summary>
 78         /// 刪除多條記錄,獨立模型
 79         /// </summary>
 80         /// <param name="T1">實體模型集合</param>
 81         /// <param name="IsCommit">是否提交(預設提交)</param>
 82         /// <returns></returns>
 83         bool DeleteList<T1>(List<T1> T, bool IsCommit = true) where T1 : class;
 84         /// <summary>
 85         /// 刪除多條記錄,獨立模型(非同步方式)
 86         /// </summary>
 87         /// <param name="T1">實體模型集合</param>
 88         /// <param name="IsCommit">是否提交(預設提交)</param>
 89         /// <returns></returns>
 90         Task<bool> DeleteListAsync<T1>(List<T1> T, bool IsCommit = true) where T1 : class;
 91 
 92         /// <summary>
 93         /// 通過Lamda表達式,刪除一條或多條記錄
 94         /// </summary>
 95         /// <param name="predicate"></param>
 96         /// <param name="IsCommit"></param>
 97         /// <returns></returns>
 98         bool Delete(Expression<Func<T, bool>> predicate, bool IsCommit = true);
 99         /// <summary>
100         /// 通過Lamda表達式,刪除一條或多條記錄(非同步方式)
101         /// </summary>
102         /// <param name="predicate"></param>
103         /// <param name="IsCommit"></param>
104         /// <returns></returns>
105         Task<bool> DeleteAsync(Expression<Func<T, bool>> predicate, bool IsCommit = true);
106 
107         /// <summary>
108         /// 執行SQL刪除
109         /// </summary>
110         /// <param name="sql">SQL語句</param>
111         /// <param name="para">Parameters參數</param>
112         int DeleteBySql(string sql, params DbParameter[] para);
113         /// <summary>
114         /// 執行SQL刪除(非同步方式)
115         /// </summary>
116         /// <param name="sql">SQL語句</param>
117         /// <param name="para">Parameters參數</param>
118         Task<int> DeleteBySql(string sql, params DbParameter[] para);
119         #endregion

 

修改獲取多條數據操作,同時增加非同步方式:

  1  #region 獲取多條數據操作
  2 
  3         /// <summary>
  4         /// 返回IQueryable集合,延時載入數據
  5         /// </summary>
  6         /// <param name="predicate"></param>
  7         /// <returns></returns>
  8         IQueryable<T> LoadAll(Expression<Func<T, bool>> predicate);
  9         /// <summary>
 10         /// 返回IQueryable集合,延時載入數據(非同步方式)
 11         /// </summary>
 12         /// <param name="predicate"></param>
 13         /// <returns></returns>
 14         Task<IQueryable<T>> LoadAllAsync(Expression<Func<T, bool>> predicate);
 15 
 16         // <summary>
 17         /// 返回List<T>集合,不採用延時載入
 18         /// </summary>
 19         /// <param name="predicate"></param>
 20         /// <returns></returns>
 21         List<T> LoadListAll(Expression<Func<T, bool>> predicate);
 22         // <summary>
 23         /// 返回List<T>集合,不採用延時載入(非同步方式)
 24         /// </summary>
 25         /// <param name="predicate"></param>
 26         /// <returns></returns>
 27         Task<List<T>> LoadListAllAsync(Expression<Func<T, bool>> predicate);
 28        
 29         /// <summary>
 30         /// 獲取DbQuery的列表
 31         /// </summary>
 32         /// <param name="predicate"></param>
 33         /// <returns></returns>
 34         DbQuery<T> LoadQueryAll(Expression<Func<T, bool>> predicate);
 35         /// <summary>
 36         /// 獲取DbQuery的列表(非同步方式)
 37         /// </summary>
 38         /// <param name="predicate"></param>
 39         /// <returns></returns>
 40         Task<DbQuery<T>> LoadQueryAllAsync(Expression<Func<T, bool>> predicate);
 41 
 42         /// <summary>
 43         /// 獲取IEnumerable列表
 44         /// </summary>
 45         /// <param name="sql">SQL語句</param>
 46         /// <param name="para">Parameters參數</param>
 47         /// <returns></returns>
 48         IEnumerable<T> LoadEnumerableAll(string sql,params DbParameter[] para);
 49         /// <summary>
 50         /// 獲取IEnumerable列表(非同步方式)
 51         /// </summary>
 52         /// <param name="sql">SQL語句</param>
 53         /// <param name="para">Parameters參數</param>
 54         /// <returns></returns>
 55         Task<IEnumerable<T>> LoadEnumerableAllAsync(string sql, params DbParameter[] para);
 56 
 57         /// <summary>
 58         /// 獲取數據動態集合
 59         /// </summary>
 60         /// <param name="sql">SQL語句</param>
 61         /// <param name="para">Parameters參數</param>
 62         /// <returns></returns>
 63         IEnumerable LoadEnumerable(string sql, params DbParameter[] para);
 64         /// <summary>
 65         /// 獲取數據動態集合(非同步方式)
 66         /// </summary>
 67         /// <param name="sql">SQL語句</param>
 68         /// <param name="para">Parameters參數</param>
 69         /// <returns></returns>
 70         Task<IEnumerable> LoadEnumerableAsync(string sql, params DbParameter[] para);
 71 
 72         /// <summary>
 73         /// 採用SQL進行數據的查詢,返回IList集合
 74         /// </summary>
 75         /// <param name="sql">SQL語句</param>
 76         /// <param name="para">Parameters參數</param>
 77         /// <returns></returns>
 78         List<T> SelectBySql(string sql, params DbParameter[] para);
 79         /// <summary>
 80         /// 採用SQL進行數據的查詢,返回IList集合(非同步方式)
 81         /// </summary>
 82         /// <param name="sql">SQL語句</param>
 83         /// <param name="para">Parameters參數</param>
 84         /// <returns></returns>
 85         Task<List<T>> SelectBySqlAsync(string sql, params DbParameter[] para);
 86 
 87         /// <summary>
 88         /// 採用SQL進行數據的查詢,指定泛型,返回IList集合
 89         /// </summary>
 90         /// <typeparam name="T1"></typeparam>
 91         /// <param name="sql"></param>
 92         /// <param name="para"></param>
 93         /// <returns></returns>
 94         List<T1> SelectBySql<T1>(string sql, params DbParameter[] para);
 95         /// <summary>
 96         /// 採用SQL進行數據的查詢,指定泛型,返回IList集合
 97         /// </summary>
 98         /// <typeparam name="T1"></typeparam>
 99         /// <param name="sql"></param>
100         /// <param name="para"></param>
101         /// <returns></returns>
102         Task<List<T1>> SelectBySqlAsync<T1>(string sql, params DbParameter[] para);
103 
104         /// <summary>
105         /// 可指定返回結果、排序、查詢條件的通用查詢方法,返回實體對象集合
106         /// </summary>
107         /// <typeparam name="TEntity">實體對象</typeparam>
108         /// <typeparam name="TOrderBy">排序欄位類型</typeparam>
109         /// <typeparam name="TResult">數據結果,與TEntity一致</typeparam>
110         /// <param name="where">過濾條件,需要用到類型轉換的需要提前處理與數據表一致的</param>
111         /// <param name="orderby">排序欄位</param>
112         /// <param name="selector">返回結果(必須是模型中存在的欄位)</param>
	   

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 看懂此文,不再困惑於 JS 中的事件設計 今天剛在關註的微信公眾號看到的文章,關於JS事件的,寫的很詳細也很容易理解,相關的知識點都有總結到,看完就有種很舒暢的感覺,該串起來的知識點都串起來了。反正一位元組:爽。 作者:aitangyong 鏈接:blog.csdn.net/aitangyong/ar ...
  • 在學習javascript中,如果在事件的使用上出現一些反差效果,不良效果,如滑鼠的移入移出時,顯示你所需要的內容, 但就是沒有出現,然而你不斷的檢查代碼,逐個代碼查錯,還在瀏覽器的調試工具中調試都沒有發現錯誤,沒有看到你所 想要的錯誤,那麼這個時候你要判斷一下是不是冒泡事件帶來的不良效果了,不過在 ...
  • HTML5 History API提供了一種功能,能讓開發人員在不刷新整個頁面的情況下修改站點的URL。這個功能很有用,例如通過一段JavaScript代碼局部載入頁面的內容,你希望通過改變當前頁面的URL來反應出頁面內容的變化,這時該功能可以派上用場。 舉個例子,當用戶從首頁進入幫助頁面時,我們通 ...
  • 非行間樣式案例 IE獲取非行間樣式 Chrome/FF獲取非行間樣式 我的相容性寫法 我的擴展性寫法 ==註意== 以上只能獲取非行間樣式,不能設置非房間樣式的值。 ...
  • 其實,圖片預覽功能非常地常見。很意外,之前遇到上傳圖片的時候都不需要預覽,也一直沒有去實現過。現在手上的項目又需要有圖片預覽功能,所以就動手做了一個小插件。在此分享一下思路。 一、實現圖片預覽的一些方法。 瞭解了一下,其實方法都是大同小異的。大概有以下幾種方式: ①訂閱input[type=file ...
  • 一、變數的作用域要懂得閉包,起首必須懂得Javascript特別的變數作用域。變數的作用域無非就是兩種:全局變數和局部變數。Javascript說話的特別之處,就在於函數內部可以直接讀取全局變數。Js代碼 var n=999; function f1(){ alert(n); } f1(); // ...
  • DECLARE @tb1 Table( drive varchar(20), [MB 可用空間] varchar(20)) INSERT INTO @tb1 Exec master.dbo.xp_fixeddrives select drive , CAST( CAST((CAST([MB 可用空間 ...
  • ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...