1. 程式人生 > >ASP.NET MVC IOC 之AutoFac

ASP.NET MVC IOC 之AutoFac

1、重寫成員“Autofac.Integration.Mvc.AutofacDependencyResolver.GetService(System.Type)”時違反了繼承安全性規則。

第一次瞭解這個東西,為了實現依賴註冊看看效果,直接取從別人的專案裡面取了Autofac.dll 和Autofac.Integration.Mvc.dll 直接使用。但怎麼也不對 就報上面的錯誤。

解決:

要把這兩個包安裝到自己的專案中   專案(右擊)-->管理Nuget程式包-->輸入autofac  下載這兩個就可以了

2、具體實現我扒了下別人的,容易理解

1、為什麼使用AutoFac?

之前介紹了Unity和Ninject兩個IOC容器,但是發現園子裡用AutoFac的貌似更為普遍,於是捯飭了兩天,發現這個東東確實是個高大上的IOC容器~

Autofac是.NET領域最為流行的IOC框架之一,傳說是速度最快的一個:

優點:

  • 它是C#語言聯絡很緊密,也就是說C#裡的很多程式設計方式都可以為Autofac使用,例如可以用Lambda表示式註冊元件

  • 較低的學習曲線,學習它非常的簡單,只要你理解了IoC和DI的概念以及在何時需要使用它們

  • XML配置支援

  • 自動裝配

  • 與Asp.Net MVC 3整合

  • 微軟的Orchad開源程式使用的就是Autofac,從該原始碼可以看出它的方便和強大

既然它都這麼牛X了,我們用它就理所當然了,所以推薦其為IOC的終極解決方案!

二、AutoFac的使用

首先你必須獲取AutoFac,這裡你可以通過各種方式載入它,我這裡還是通過VS中的NuGet來載入AutoFac,不論是哪種方式,最終的目的就是將 Autofac.dll,Autofac.Configuration.dll 這兩個程式集引用到你的專案中。這樣在你的專案中,如果想使用AutoFac,只需新增其名稱空間引用即可~

1、AutoFac入門

我們先定義一個數據訪問的介面:

  1. public interface IDAL  
  2. {  
  3. void Insert(string commandText);  

然後用Sql和Oracle兩種方式分別實現上述介面,不過這裡只是演示而已,所以並沒有真正去實現這兩個類,你懂的~

SQL方式:

  1. publicclass SqlDAL : IDAL  
  2. {  
  3. publicvoid Insert(string commandText)  
  4.     {  
  5.         Console.WriteLine("使用sqlDAL新增相關資訊");  
  6.     }  

Oracle方式:

  1. publicclass OracleDAL : IDAL  
  2. {  
  3. publicvoid Insert(string commandText)  
  4.     {  
  5.         Console.WriteLine("使用OracleDAL新增相關資訊");  
  6.     }  

然後注入實現建構函式注入:

  1. publicclass DBManager   
  2. {   
  3.     IDAL _dal;  
  4. public DBManager(IDAL dal)   
  5.     {   
  6.         _dal= dal;  
  7.     }  
  8. publicvoid Add(string commandText)   
  9.     {   
  10.         _dal.Insert(commandText);   
  11.     }  

最後要真正完成依賴注入就得AtuoFac登場了:

  1. var builder = new ContainerBuilder();   
  2. builder.RegisterType<DBManager>();   
  3. builder.RegisterType<SqlDAL>().As<IDAL>();   
  4. using (var container = builder.Build())   
  5. {   
  6.     var manager = container.Resolve<DBManager>();   
  7.     manager.Add("INSERT INTO Persons VALUES ('Man', '25', 'WangW', 'Shanghai')");   

從以上栗子可以看出,其實AutoFac的使用跟Unity的使用有點像,關鍵的東東就是這個Container容器類

2、AutoFac常用方法說明

(1)builder.RegisterType<Object>().As<Iobject>():註冊型別及其例項。例如下面就是註冊介面IDAL的例項SqlDAL

  1. ContainerBuilder builder = new ContainerBuilder();  
  2. builder.RegisterType<SqlDAL>().As<IDAL>();  
  3. IContainer container = builder.Build();  
  4. SqlDAL sqlDAL = (SqlDAL)container.Resolve<IDAL>(); 

(2)IContainer.Resolve<IDAL>():解析某個介面的例項。例如上面的最後一行程式碼就是解析IDAL的例項SqlDAL

(3)builder.RegisterType<Object>().Named<Iobject>(string name):為一個介面註冊不同的例項。有時候難免會碰到多個類對映同一個介面,比如SqlDAL和OracleDAL都實現了IDAL介面,為了準確獲取想要的型別,就必須在註冊時起名字。

  1. builder.RegisterType<SqlDAL>().Named<IDAL>("sql");  
  2. builder.RegisterType<OracleDAL>().Named<IDAL>("oracle");  
  3. IContainer container = builder.Build();  
  4. SqlDAL sqlDAL = (SqlDAL)container.ResolveNamed<IDAL>("sql");  
  5. OracleDAL oracleDAL = (OracleDAL)container.ResolveNamed<IDAL>("oracle"); 

(4)IContainer.ResolveNamed<IDAL>(string name):解析某個介面的“命名例項”。例如上面的最後一行程式碼就是解析IDAL的命名例項OracleDAL

(5)builder.RegisterType<Object>().Keyed<Iobject>(Enum enum):以列舉的方式為一個介面註冊不同的例項。有時候我們會將某一個介面的不同實現用列舉來區分,而不是字串,例如:

  1. publicenum DBType{ Sql, Oracle} 
  1. builder.RegisterType<SqlDAL>().Keyed<IDAL>(DBType.Sql);  
  2. builder.RegisterType<OracleDAL>().Keyed<IDAL>(DBType.Oracle);  
  3. IContainer container = builder.Build();  
  4. SqlDAL sqlDAL = (SqlDAL)container.ResolveKeyed<IDAL>(DBType.Sql);  
  5. OracleDAL oracleDAL = (OracleDAL)container.ResolveKeyed<IDAL>(DBType.Oracle); 

(6)IContainer.ResolveKeyed<IDAL>(Enum enum):根據列舉值解析某個介面的特定例項。例如上面的最後一行程式碼就是解析IDAL的特定例項OracleDAL

(7)builder.RegisterType<Worker>().InstancePerDependency():用於控制物件的生命週期,每次載入例項時都是新建一個例項,預設就是這種方式

(8)builder.RegisterType<Worker>().SingleInstance():用於控制物件的生命週期,每次載入例項時都是返回同一個例項

(9)IContainer.Resolve<T>(NamedParameter namedParameter):在解析例項T時給其賦值

  1. DBManager manager = container.Resolve<DBManager>(new NamedParameter("name""SQL")); 
  1. publicclass DBManager   
  2. {     
  3.     IDAL dal;  
  4. public DBManager (string name,IDAL  _dal)  
  5.     {  
  6.         Name = name;  
  7.         dal= _dal;  
  8.     }  

3、通過配置的方式使用AutoFac

(1)先配置好配置檔案

  1. <?xmlversion="1.0"?>
  2. <configuration>
  3. <configSections>
  4. <sectionname="autofac"type="Autofac.Configuration.SectionHandler, Autofac.Configuration"/>
  5. </configSections>
  6. <autofacdefaultAssembly="ConsoleApplication1">
  7. <components>
  8. <componenttype="ConsoleApplication1.SqlDAL, ConsoleApplication1"service="ConsoleApplication1.IDAL"/>
  9. </components>
  10. </autofac>
  11. </configuration>

(2)讀取配置實現依賴注入(注意引入Autofac.Configuration.dll)

  1. staticvoid Main(string[] args)  
  2.     {  
  3.         ContainerBuilder builder = new ContainerBuilder();  
  4.         builder.RegisterType<DBManager>();  
  5.         builder.RegisterModule(new ConfigurationSettingsReader("autofac"));  
  6. using (IContainer container = builder.Build())  
  7.         {  
  8.             DBManager manager = container.Resolve<DBManager>();  
  9.             manager.Add("INSERT INTO Persons VALUES ('Man', '25', 'WangW', 'Shanghai')");   
  10.     }  

三、ASP.NET MVC與AtuoFac

終於到了ASP.NET MVC與AtuoFac雙劍合璧的時候了,下面就看看AtuoFac在MVC中的應用,其實很簡單,大概就幾個步驟搞定:

1、首先在函式Application_Start() 註冊自己的控制器類,一定要引入Autofac.Integration.Mvc.dll

  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Web;  
  5. using System.Web.Http;  
  6. 相關推薦

    ASP.NET MVC IOC AutoFac

    1、重寫成員“Autofac.Integration.Mvc.AutofacDependencyResolver.GetService(System.Type)”時違反了繼承安全性規則。 第一次瞭解這個東西,為了實現依賴註冊看看效果,直接取從別人的專案裡面取了Autof

    ASP.NET MVC Bundles 學習筆記

    sax asp.net 發現 ati mvc cti java 意思 學習 在網頁中,我們經常需要引用大量的javascript和css文件,在加上許多javascript庫都包含debug版和經過壓縮的release版(比如jquery),不僅麻煩還很容易引起混亂,所以A

    ASP.NET MVC Model二模型綁定

    數據包 set count 效果 模型 shtml 獲得 tex turn Asp.net mvc中的模型綁定,或許大家經常用,但是具體說他是怎麽一回事,可能還是會有些陌生,那麽,本文就帶你理解模型綁定。為了理解模型綁定,本文會先給出其定義,然後對通過比,來得出使用模型綁定

    async、await在ASP.NET[ MVC]中線程死鎖的故事

    div pos ask 其他 flow ron ttpClient com async 場景重構 public ActionResult Index(string ucode) { string userInfo = G

    ASP.NET MVC學習Ajax(完結)

    等待 failure lba info 學習 有一個 代碼 orm 修改 網址:https://www.cnblogs.com/yaozhenfa/p/asp_net_mvc_ajax.html 一.前言 通過上面的一番學習,大家一定收獲不少。但是總歸會有一個結束的時候

    解析ASP.NET Mvc開發查詢資料例項

    目錄: -------------------------------------------------------------------------------------------

    ASP.NET MVC 系列 (強型別HTML輔助方法使用)

    強型別輔助方法及及相關普通方法介紹一、普通Html輔助方法 1、@Html.Lable(元素名稱,元素值,元素屬性) 示例: @Html.Lable("GenreName","流行",new { @class="validation" }) 渲染之後程式碼如下 <la

    Asp.net mvc 網站速度優化 -- 頁面快取

    網站速度優化的一般方法 由於網站最重要的使用者體驗就是速度,特別是對於電子商務網站而言。 一般網站速度優化會涉及到幾個方面: 1. 資料庫優化 — 查詢欄位簡歷索引,使用資料庫連線池和持久化,現在還有種趨勢,就是選擇使用No SQL作為補充; 2. 資料快取 — 使用Memc

    Asp.Net MVC Autofac 初步使用3 整合web api

    今天我們試著在WebApi2實現autofac的注入,關於這方面也是看了幾位園友的分享省了不少時間,所以結合著前篇的demo再新建webapi進行... demo3下載地址:  http://pan.baidu.com/s/1eSCAZtC 一樣開篇還是發下大概demo結構

    Asp.Net MVC Autofac 初步使用2 整合mvc 屬性注入以及自動注入

    首先看下Demo2的結構 分享下demo原始碼 :http://pan.baidu.com/s/1qYtZCrM     然後下面一步步將Autofac整合到mvc中。 首先,定義Model Product.cs public class Product {

    IOC Of Ninject Base On ASP.NET MVC

    dex 準備工作 應用 new 引用 cti err art part 說在之前的話 IOC的概念相信大家比較熟悉了,習慣性稱之為依賴註入或控制反轉,園子裏對基於MVC平臺IOC設計模式已經相當多了,但大家都只知道應該怎麽應用一個IOC模式,比如Ninject, Unity

    學習-ASP.NET MVC Filter

    error 之間 邏輯 過濾器 ron 記錄 except hand 結果 MVC Filter 是典型的AOP應用,對MVC框架處理客戶端請求註入額外的一些邏輯,如日誌記錄、緩存處理、異常處理和權限驗證,性能檢測(橫切關註點),而這些邏輯通常與主要業務無關,被獨立分開作為

    Asp.Net MVC EF-DbFirst增刪改查

    生成 處的 message mod 更新 get請求 layout 失敗 inf 控制器及動作方法: using System; using System.Collections.Generic; using System.Linq; using System.Web;

    ASP.NET MVC Autofac依賴註入的一點小心得(包含特性註入)

    使用 quest ont var nbsp sin posit size 繼承關系 前言 IOC的重要性 大家都清楚..便利也都知道..新的ASP.NET Core也大量使用了這種手法.. 一直憋著沒寫ASP.NET Core的文章..還是怕誤導大家.. 今天這篇也不是講C

    JSONAsp.net MVC C#對象轉JSON,DataTable轉JSON,List<T>轉JSON,JSON轉List<T>,JSON轉C#對象

    技術分享 toolbar index 基本 枚舉 對象轉json tostring cab 拼接 一、JSON解析與字符串化   JSON.stringify()  序列化對象、數組或原始值   語法:JSON.stringify(o,filter,indent)     

    asp.net mvcActionResult

    new 特殊 包含 string 工作 json數據 value orm none Web服務器接收到一個客戶端請求以後,會對請求予以相應,而這個響應是通過Response來控制的, 但是在asp.net mvc 裏,這部分的工作是由ActionResult來完成的,

    Asp.NET MVC 調試訪問 webservice 時出現“ 無法找到資源 ”的錯誤

    相對 mvc option logs 控制器 inf code 資源 index   問題情景如標題,具體錯誤如下圖:      出現以上情況,是程序將 .asmx 文件按控制器方式解析了,在 RouteConfig.cs 文件的 RegisterRoutes 方法中忽略

    【第二篇】ASP.NET MVC快速入門數據註解(MVC5+EF6)

    red 數據庫結構 varchar model 菜單 錯誤提示 edi 還需 問題 目錄 【第一篇】ASP.NET MVC快速入門之數據庫操作(MVC5+EF6) 【第二篇】ASP.NET MVC快速入門之數據註解(MVC5+EF6) 【第三篇】ASP.NET MVC快速入

    【第三篇】ASP.NET MVC快速入門安全策略(MVC5+EF6)

    對象 code word 單身 script ticket bsp 金額 class 【第一篇】ASP.NET MVC快速入門之數據庫操作(MVC5+EF6) 【第二篇】ASP.NET MVC快速入門之數據註解(MVC5+EF6) 【第三篇】ASP.NET MVC快速入門之

    Asp.Net MVC 5使用Identity簡單的註冊和登陸

    stat bar del info var asp.net rem boot manage 由於.Net MVC 5登陸和註冊方式有很多種,但是Identity方式去實現或許會更簡單更容易理解 首先新建一個項目 其次如下選擇Empty和MVC的選項 然後打開NuGe