AutoFac (控制反轉IOC 與依賴注入DI) 優化
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace FB.CMS.Repository { using FB.CMS.IRepository; using System.Data.Entity; using System.Data.Entity.Infrastructure; using System.Linq.Expressions; using System.Runtime.Remoting.Messaging; using System.Threading; public class BaseDal<TEntity> : IBaseDal<TEntity> where TEntity : class { //BaseDbContext db = new BaseDbContext(); //對建立上下文容器類物件進行優化(原理:一個執行緒下我們只建立一個上下文容器類物件,然後儲存到執行緒快取當中去,當同一個執行緒過來的時候,就從執行緒快取當中取上下文容器類物件) public BaseDbContext db { get { //獲取BaseDbContext的完全限定名,其實這個名字沒什麼特別的意義,僅僅是一個名字而已,也可以取別的名字的 string threadName = typeof(BaseDbContext).FullName; //獲取key為threadName的這個執行緒快取(CallContext就是執行緒快取容器類) object dbObj = CallContext.GetData(threadName); //如果key為threadName的執行緒快取不存在 if (dbObj == null) { //建立BaseDbContext類的物件例項 dbObj = new BaseDbContext(); //將這個BaseDbContext類的物件例項儲存到執行緒快取當中(以鍵值對的形式進行儲存的,我這就將key設為當前執行緒的完全限定名了) CallContext.SetData(threadName, dbObj); return dbObj as BaseDbContext; } return dbObj as BaseDbContext; } } DbSet<TEntity> _dbset; public BaseDal() { this._dbset = db.Set<TEntity>(); //初始化 } #region 增加 public void AddEnity(TEntity model) { if (model == null) { throw new Exception("moddel不能為null"); } this._dbset.Add(model); } #endregion #region 物理刪除 /// <summary> /// 刪除 /// </summary> /// <param name="model">實體類</param> /// <param name="isaddedContext">是否物理刪除</param> public void DeleteEntity(TEntity model, bool isaddedContext) { if (model == null) { throw new Exception("DeleteEntity方法中的model不能為null"); } //如果僅僅是邏輯刪除的話,那我們只要呼叫編輯方法將標識為邏輯刪除的那個欄位修改為true就可以了。 if (isaddedContext == true) { this._dbset.Attach(model); } this._dbset.Remove(model); } #endregion #region 查尋 /// <summary> /// 普通帶條件查詢 /// </summary> /// <param name="where"></param> /// <returns></returns> public IQueryable<TEntity> QueryWhere(Expression<Func<TEntity, bool>> where) { return this._dbset.Where(where); } /// <summary> /// 連表查詢 /// </summary> /// <param name="where">連表查詢的條件篩選查詢</param> /// <param name="tablesName">要做連表查詢的所有表名集合</param> /// <returns></returns> public IQueryable<TEntity> QueryJoin(Expression<Func<TEntity, bool>> where, string[] tablesName) { if (tablesName == null || tablesName.Any() == false) { throw new Exception("連表查詢最少也要一個表,所有QueryJoin方法中tablesName中最少也需要有一個表名"); } DbQuery<TEntity> query = this._dbset; foreach (string tableName in tablesName) { //不斷的連表,直到把tablesName裡的所有表都連完 query = query.Include(tableName); } return query.Where(where); //然後對連表進行條件篩選查詢 } /// <summary> /// 帶條件的分頁查詢 /// </summary> /// <typeparam name="TKey">按哪個欄位進行排序</typeparam> /// <param name="pageindex">當前頁</param> /// <param name="pagesize">頁大小</param> /// <param name="rowCount">資料總條數</param> /// <param name="order">排序</param> /// <param name="where">篩選條件</param> /// <returns></returns> public IQueryable<TEntity> QueryByPage<TKey>(int pageindex, int pagesize, out int rowCount, Expression<Func<TEntity, TKey>> order, Expression<Func<TEntity, bool>> where) { //獲取總條數 rowCount = this._dbset.Count(where); //建議將這個Where條件語句放在前面,如果你放到後面,分頁的時候可能存在問題。 return this._dbset.Where(where).OrderByDescending(order).Skip((pageindex - 1) * pagesize).Take(pagesize); } /// <summary> /// 呼叫儲存過程或執行SQL語句(但是我們不推薦執行sql語句) /// </summary> /// <typeparam name="TElement"> /// 因為儲存過程返回的資料不一定就是TEntity這個實體,因為儲存過返回的結果集有可能是自己拼接出來的,所以這個方法的返回結果 /// 為Lsit<TEntity>就不合適了。 這個 TElement是在呼叫的儲存過程的時候傳入的一個實體,此實體必須和呼叫的儲存過程的返回結集 /// 中的欄位名稱儲存一致(你這個儲存過程返回有多個欄位,那麼你這個實體中就應該有多少個屬性) /// </typeparam> /// <param name="sql"> /// 假設我建立了這麼一個儲存過程: /// create proc proc_T_UserInfo_Paging2(@pageSize int,@currentPage int,@CountData ) /// 那現在我們呼叫這個儲存過程,那麼這個SQL語句的寫法就是: /// proc_T_UserInfo_Paging2 @pageSize int,@currentPage int,@CountData /// /// </param> /// <param name="prms">引數化查詢的引數陣列</param> /// <returns></returns> public List<TElement> RunProc<TElement>(string sql, params object[] prms) { return db.Database.SqlQuery<TElement>(sql, prms).ToList(); } #endregion #region 編輯 /// <summary> /// 編輯 /// </summary> /// <param name="model">實體</param> /// <param name="propertyNames">要編輯的的所有屬性名稱序列</param> public void EditEntity(TEntity model, string[] propertyNames) { if (model == null) { throw new Exception("EditEntity方法中的引數model不能為null"); } if (propertyNames.Any() == false || propertyNames == null) { throw new Exception("EditEntity方法中的引數propertyNames最少需要一個屬性"); } System.Data.Entity.Infrastructure.DbEntityEntry entry = db.Entry(model); entry.State = System.Data.EntityState.Unchanged; foreach (string item in propertyNames) { entry.Property(item).IsModified = true; } db.Configuration.ValidateOnSaveEnabled = false; } #endregion #region 統一儲存 public int SaveChanges() { return db.SaveChanges(); } #endregion } }
Home控制器
相關推薦
AutoFac (控制反轉IOC 與依賴注入DI) 優化
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace FB.CMS.Repository { usin
Spring框架學習筆記(1)——控制反轉IOC與依賴注入DI
Spring框架的主要作用,就是提供了一個容器,使用該容器就可以建立並管理物件。比如說Dao類等,又或者是具有多依賴關係的類(Student類中包含有Teacher類的成員變數) Spring有兩個核心概念,一個是控制反轉(IOC,全稱為Inverse of Control),另一個則是面向切面程式設計(AO
Spring的控制反轉IOC和依賴注入DI
首先想說說IoC(Inversion of Control,控制反轉)。這是spring的核心,貫穿始終。所謂IoC,對於spring框架來說,就是由spring來負責控制物件的生命週期和物件間的關係: 誰控制誰,控制什麼:傳統Java SE程式設計,我們直接在物件內部通過new進行
控制反轉(IoC)和依賴注入(DI)
容器,字面上理解就是裝東西的東西。常見的變數、物件屬性等都可以算是容器。一個容器能夠裝什麼,全部取決於你對該容器的定義。當然,有這樣一種容器,它存放的不是文字、數值,而是物件、物件的描述(類、介面)或者是提供物件的回撥,通過這種容器,我們得以實現許多高階的功能,其中最常提到的,就是 “解耦” 、“依
深入理解spring容器中的控制反轉(IOC)和依賴注入(DI)
首先在開篇之前我們一定一定要明確的就是:DI和IOC並不是兩個概念,DI是IOC思想在應用上的具體例子。 什麼是控制反轉(IOC)? “控制”就是指一件事物對另一件事物進行一種管理,而另一件事物處在一件事物的管理之下,這就叫控制。 在面向物件程式設計的時候,每一個程式的
控制反轉(IoC)以及依賴注入(DI)的解釋
理解IoC和DI對於Spring的初學者來說是很重要的. 剛開始接觸到這兩個詞感覺過於抽象實在難懂,會有很多問題產生,什麼叫反轉?什麼是依賴關係,啥又叫注入? 程式設計師都是懶惰和高冷的 記住這句話,因此一個純粹的程式設計師都會想方設法讓自己的程式碼變得簡潔,並且後期修改的
.NET IoC模式依賴反轉(DIP)、控制反轉(Ioc)、依賴注入(DI)
# 依賴倒置原則(DIP) 依賴倒置(Dependency Inversion Principle,縮寫DIP)是面向物件六大基本原則之一。他是指一種特定的的解耦形式,使得高層次的模組不依賴低層次的模組的實現細節,依賴關係被顛倒(反轉),從而使得低層次模組依賴於高層次模組的需求抽象. 該原則規定: -
控制反轉IOC與依賴註入DI - 理論篇
ava 單元測試 第三方 img 在一起 轉載 反轉 代碼 產品 學無止境,精益求精 十年河東十年河西,莫欺少年窮 昨天是五一小長假歸來上班的第一天,身體疲勞,毫無工作熱情。於是就看看新聞,喝喝茶,荒廢了一天 也就在昨天,康美同事張晶童鞋讓我學習下IOC的理論及實現,畢竟是
控制反轉IOC的依賴注入方式 【調侃】IOC前世今生 IoC模式 談談對Spring IOC的理解 一個簡單的小程式演示Unity的三種依賴注入方式 小菜學習設計模式(五)—控制反轉(Ioc) IoC模式(依賴、依賴倒置、依賴注入、控制反轉) IoC模式
轉自:https://www.cnblogs.com/ysyn/p/5563256.html 引言: 專案中遇到關於IOC的一些內容,因為和正常的邏輯程式碼比較起來,IOC有點反常。因此本文記錄IOC的一些基礎知識,並附有相應的簡單例項,而在實際專案中再複雜的應用也只是在
依賴耦合、解耦、控制反轉(IOC)、依賴註入
增加 clas 說明 class a lan xxx ron pen pub 隨著net的深入學習,出現了很多概念性的東西需要理解,現在統一記錄一下。 1.依賴:現階段在任何一個有請求作用的系統,都會出現A類調用B類的情況,這時候A類就依賴於B類,A類和B類存在依賴關系。
1.Spring、IOC與依賴注入
Spring概述 Spring是分層的Java SE/EE應用 full-stack輕量級開源框架,以IoC(Inverse Of Control:反轉控制)和 AOP(Aspect Oriented Programming:面向切面程式設計)為核心,提供了展現層Spr
控制反轉與依賴注入概述——Spring IOC/DI(一)
Spring IOC/DI(一)——控制反轉與依賴注入概述 前面我們已經講過了關於spring對bean的管理,下面我們來講一下Spring的核心之一——IOC/DI。相信很多學過Spring同學都有一個問題,就是對控制反轉和依賴注入暈暈乎乎的不太懂,這裡簡單給大家介紹一下到底什麼是
Java:控制反轉(IoC)與依賴注入(DI)
很長一段時間裡,我對控制反轉和依賴注入這兩個概念很模糊,閉上眼睛想一想,總有一種眩暈的感覺。但為了成為一名優秀的 Java 工程師,我花了一週的時間,徹底把它們搞清楚了。 01、緊耦合 在我們編碼的過程中,通常都需要兩個或者更多的類通過彼此的合作來實現業務邏輯,也就是說,某個物件需要獲取與其合作物件的引用
Spring 控制反轉(IOC) | 依賴注入(DI)的解析
學習過Spring框架的人一定都會聽過Spring的IoC(控制反轉) 、DI(依賴注入)這兩個概念,對於初學Spring的人來說,總覺得IoC 、DI這兩個概念是模糊不清的,是很難理解的,今天和大家分享網上的一些技術大牛們對Spring框架的IOC的理解以及談談我對Spri
也談Spring之依賴注入DI/控制反轉IOC
首先提問, 什麼是 Spring IOC 容器? Spring 框架的核心是 Spring 容器。容器建立物件,將它們裝配在一起,配置它們並管理它們的完整生命週期。Spring 容器使用依賴注入來管理組成應用程式的元件。容器通過讀取提供的配置元資料來接收物件
研究java的依賴注入DI和控制反轉IoC
java中的概念比較多,經常看到java文章談依賴注入和控制反轉,一直沒時間深究,今天花幾分鐘看了一下,總結一下,就是抽象和反射。 c++原生不支援反射,但可以有辦法解決,比如微軟體的MIDL定義ocx介面就可實現差不多的效果。 至於DI和IoC的抽象,是一種很常見的設計模式,在c++中用v
依賴注入(DI)和控制反轉(IoC)
依賴注入(DI)和控制反轉(IoC)是一個意思。 當某個java物件需要呼叫另一個java物件(被依賴者),在傳統模式下通常有兩種做法: 原始做法: 呼叫者主動建立被依賴物件,然後再呼叫被依賴物件的方法。 簡單工廠模式: 呼叫者先找到被依賴物件的工廠,然後主動通過工廠去獲取被依賴
Spring學習,依賴注入(DI)、控制反轉(IoC)和麵向切面(AOP)
依賴注入(DI)和控制反轉(IoC) 在日常編碼中經常遇到在一個類中呼叫另一個類的多個方法,所以就在一個類中new出需要用到的類,也就是組合模式。比如說A類裡面需要用到很多B類裡面的方法,所以要在A類裡面new一個B。 public class
依賴注入DI和控制反轉IOC思想
轉:學習過Spring框架的人一定都會聽過Spring的IoC(控制反轉) 、DI(依賴注入)這兩個概念,對於初學Spring的人來說,總覺得IoC 、DI這兩個概念是模糊不清的,是很難理解的,今天和大家分享網上的一些技術大牛們對Spring框架的IOC的理解以及談談我對Sp
Spring.net 控制反轉(IOC)依賴注入(DI)的使用 以及Config檔案的配置
IOC 一 、把 \Spring.Net\Spring.NET-2.0.0-M1\Spring.NET\bin\net\4.0\release下的 三個核心檔案 S