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入門
我們先定義一個數據訪問的介面:
- public interface IDAL
- {
- void Insert(string commandText);
- }
然後用Sql和Oracle兩種方式分別實現上述介面,不過這裡只是演示而已,所以並沒有真正去實現這兩個類,你懂的~
SQL方式:
- publicclass SqlDAL : IDAL
- {
- publicvoid Insert(string commandText)
- {
- Console.WriteLine("使用sqlDAL新增相關資訊");
- }
- }
Oracle方式:
- publicclass OracleDAL : IDAL
- {
- publicvoid Insert(string commandText)
- {
- Console.WriteLine("使用OracleDAL新增相關資訊");
- }
- }
然後注入實現建構函式注入:
- publicclass DBManager
- {
- IDAL _dal;
- public DBManager(IDAL dal)
- {
- _dal= dal;
- }
- publicvoid Add(string commandText)
- {
- _dal.Insert(commandText);
- }
- }
最後要真正完成依賴注入就得AtuoFac登場了:
- var builder = new ContainerBuilder();
- builder.RegisterType<DBManager>();
- builder.RegisterType<SqlDAL>().As<IDAL>();
- using (var container = builder.Build())
- {
- var manager = container.Resolve<DBManager>();
- manager.Add("INSERT INTO Persons VALUES ('Man', '25', 'WangW', 'Shanghai')");
- }
從以上栗子可以看出,其實AutoFac的使用跟Unity的使用有點像,關鍵的東東就是這個Container容器類
2、AutoFac常用方法說明
(1)builder.RegisterType<Object>().As<Iobject>():註冊型別及其例項。例如下面就是註冊介面IDAL的例項SqlDAL
- ContainerBuilder builder = new ContainerBuilder();
- builder.RegisterType<SqlDAL>().As<IDAL>();
- IContainer container = builder.Build();
- SqlDAL sqlDAL = (SqlDAL)container.Resolve<IDAL>();
(2)IContainer.Resolve<IDAL>():解析某個介面的例項。例如上面的最後一行程式碼就是解析IDAL的例項SqlDAL
(3)builder.RegisterType<Object>().Named<Iobject>(string name):為一個介面註冊不同的例項。有時候難免會碰到多個類對映同一個介面,比如SqlDAL和OracleDAL都實現了IDAL介面,為了準確獲取想要的型別,就必須在註冊時起名字。
- builder.RegisterType<SqlDAL>().Named<IDAL>("sql");
- builder.RegisterType<OracleDAL>().Named<IDAL>("oracle");
- IContainer container = builder.Build();
- SqlDAL sqlDAL = (SqlDAL)container.ResolveNamed<IDAL>("sql");
- OracleDAL oracleDAL = (OracleDAL)container.ResolveNamed<IDAL>("oracle");
(4)IContainer.ResolveNamed<IDAL>(string name):解析某個介面的“命名例項”。例如上面的最後一行程式碼就是解析IDAL的命名例項OracleDAL
(5)builder.RegisterType<Object>().Keyed<Iobject>(Enum enum):以列舉的方式為一個介面註冊不同的例項。有時候我們會將某一個介面的不同實現用列舉來區分,而不是字串,例如:
- publicenum DBType{ Sql, Oracle}
- builder.RegisterType<SqlDAL>().Keyed<IDAL>(DBType.Sql);
- builder.RegisterType<OracleDAL>().Keyed<IDAL>(DBType.Oracle);
- IContainer container = builder.Build();
- SqlDAL sqlDAL = (SqlDAL)container.ResolveKeyed<IDAL>(DBType.Sql);
- 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時給其賦值
- DBManager manager = container.Resolve<DBManager>(new NamedParameter("name", "SQL"));
- publicclass DBManager
- {
- IDAL dal;
- public DBManager (string name,IDAL _dal)
- {
- Name = name;
- dal= _dal;
- }
- }
3、通過配置的方式使用AutoFac
(1)先配置好配置檔案
- <?xmlversion="1.0"?>
- <configuration>
- <configSections>
- <sectionname="autofac"type="Autofac.Configuration.SectionHandler, Autofac.Configuration"/>
- </configSections>
- <autofacdefaultAssembly="ConsoleApplication1">
- <components>
- <componenttype="ConsoleApplication1.SqlDAL, ConsoleApplication1"service="ConsoleApplication1.IDAL"/>
- </components>
- </autofac>
- </configuration>
(2)讀取配置實現依賴注入(注意引入Autofac.Configuration.dll)
- staticvoid Main(string[] args)
- {
- ContainerBuilder builder = new ContainerBuilder();
- builder.RegisterType<DBManager>();
- builder.RegisterModule(new ConfigurationSettingsReader("autofac"));
- using (IContainer container = builder.Build())
- {
- DBManager manager = container.Resolve<DBManager>();
- manager.Add("INSERT INTO Persons VALUES ('Man', '25', 'WangW', 'Shanghai')");
- }
三、ASP.NET MVC與AtuoFac
終於到了ASP.NET MVC與AtuoFac雙劍合璧的時候了,下面就看看AtuoFac在MVC中的應用,其實很簡單,大概就幾個步驟搞定:
1、首先在函式Application_Start() 註冊自己的控制器類,一定要引入Autofac.Integration.Mvc.dll
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Web;
- using System.Web.Http;
相關推薦
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
JSON之Asp.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 mvc之ActionResult
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