1. 程式人生 > >AutoFac (控制反轉IOC 與依賴注入DI) 優化

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的三種依賴注入方式 小菜學習設計模式(五)—控制反轉IocIoC模式(依賴依賴倒置、依賴注入控制反轉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