国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

ASP.NET MVC IOC 之AutoFac攻略

開發(fā) 后端
Autofac是.NET領域最為流行的IOC框架之一,既然它都這么牛X了,我們用它就理所當然了,所以推薦其為IOC的終極解決方案!

一、為什么使用AutoFac?

之前介紹了Unity和Ninject兩個IOC容器,但是發(fā)現(xiàn)園子里用AutoFac的貌似更為普遍,于是捯飭了兩天,發(fā)現(xiàn)這個東東確實是個高大上的IOC容器~

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

優(yōu)點: 

  • 它是C#語言聯(lián)系很緊密,也就是說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入門

我們先定義一個數(shù)據(jù)訪問的接口:

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

然后用Sql和Oracle兩種方式分別實現(xiàn)上述接口,不過這里只是演示而已,所以并沒有真正去實現(xiàn)這兩個類,你懂的~

SQL方式:

  1. public class SqlDAL : IDAL  
  2. {  
  3.     public void Insert(string commandText)  
  4.     {  
  5.         Console.WriteLine("使用sqlDAL添加相關信息");  
  6.     }  

Oracle方式:

  1. public class OracleDAL : IDAL  
  2. {  
  3.     public void Insert(string commandText)  
  4.     {  
  5.         Console.WriteLine("使用OracleDAL添加相關信息");  
  6.     }  

然后注入實現(xiàn)構造函數(shù)注入:

  1. public class DBManager   
  2. {   
  3.     IDAL _dal;  
  4.     public DBManager(IDAL dal)   
  5.     {   
  6.         _dal= dal;  
  7.     }  
  8. public void 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都實現(xiàn)了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):以枚舉的方式為一個接口注冊不同的實例。有時候我們會將某一個接口的不同實現(xiàn)用枚舉來區(qū)分,而不是字符串,例如:

  1. public enum 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):根據(jù)枚舉值解析某個接口的特定實例。例如上面的最后一行代碼就是解析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. public class DBManager   
  2. {     
  3.     IDAL dal;  
  4.     public DBManager (string name,IDAL  _dal)  
  5.     {  
  6.         Name = name;  
  7.         dal= _dal;  
  8.     }  

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

(1)先配置好配置文件

  1. <?xml version="1.0"?> 
  2.   <configuration> 
  3.     <configSections> 
  4.       <section name="autofac" type="Autofac.Configuration.SectionHandler, Autofac.Configuration"/> 
  5.     </configSections> 
  6.     <autofac defaultAssembly="ConsoleApplication1"> 
  7.       <components> 
  8.         <component type="ConsoleApplication1.SqlDAL, ConsoleApplication1" service="ConsoleApplication1.IDAL" /> 
  9.       </components> 
  10.     </autofac> 
  11.   </configuration> 

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

  1. static void 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.     }  

#p#

三、ASP.NET MVC與AtuoFac

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

1、首先在函數(shù)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. using System.Web.Mvc;  
  7. using System.Web.Optimization;  
  8. using System.Web.Routing;  
  9. using Autofac;  
  10. using AtuoFacOfMVC4.Models;  
  11. using System.Reflection;  
  12. using Autofac.Integration.Mvc;  
  13.  
  14.  
  15. namespace AtuoFacOfMVC4  
  16. {  
  17.    public class MvcApplication : System.Web.HttpApplication  
  18.     {  
  19.         protected void Application_Start()  
  20.         {  
  21.             var builder = new ContainerBuilder();  
  22.             SetupResolveRules(builder);  
  23.             builder.RegisterControllers(Assembly.GetExecutingAssembly());  
  24.             var container = builder.Build();  
  25.             DependencyResolver.SetResolver(new AutofacDependencyResolver(container));  
  26.  
  27.             AreaRegistration.RegisterAllAreas();  
  28.             WebApiConfig.Register(GlobalConfiguration.Configuration);  
  29.             FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);  
  30.             RouteConfig.RegisterRoutes(RouteTable.Routes);  
  31.             BundleConfig.RegisterBundles(BundleTable.Bundles);  
  32.             AuthConfig.RegisterAuth();  
  33.         }  
  34.         private void SetupResolveRules(ContainerBuilder builder)  
  35.         {  
  36.             builder.RegisterType<StudentRepository>().As<IStudentRepository>();  
  37.         }  
  38.     }  

2、現(xiàn)在在你的MVC程序中注入依賴代碼就ok了

(1)首先聲明一個Student學生類

  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Web;  
  5.  
  6. namespace AtuoFacOfMVC4.Models  
  7. {  
  8.     public class Student  
  9.     {  
  10.         public int Id { get; set; }  
  11.         public string Name { get; set; }  
  12.         public string Graduation { get; set; }  
  13.         public string School { get; set; }  
  14.         public string Major { get; set; }  
  15.     }  
  16. }  

(2)然后聲明倉儲接口及其實現(xiàn)

  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Text;  
  5.  
  6. namespace AtuoFacOfMVC4.Models  
  7. {  
  8.     public interface IStudentRepository  
  9.     {  
  10.         IEnumerable<Student> GetAll();  
  11.         Student Get(int id);  
  12.         Student Add(Student item);  
  13.         bool Update(Student item);  
  14.         bool Delete(int id);  
  15.     }  
  16. }  
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Web;  
  5.  
  6. namespace AtuoFacOfMVC4.Models  
  7. {  
  8.     public class StudentRepository : IStudentRepository  
  9.     {  
  10.         private List<Student> Articles = new List<Student>();  
  11.  
  12.         public StudentRepository()  
  13.         {  
  14.             //添加演示數(shù)據(jù)  
  15.             Add(new Student { Id = 1, Name = "張三", Major = "軟件工程", Graduation = "2013年", School = "西安工業(yè)大學" });  
  16.             Add(new Student { Id = 2, Name = "李四", Major = "計算機科學與技術", Graduation = "2013年", School = "西安工業(yè)大學" });  
  17.             Add(new Student { Id = 3, Name = "王五", Major = "自動化", Graduation = "2013年", School = "西安工業(yè)大學" });  
  18.         }  
  19.         /// <summary>  
  20.         /// 獲取全部學生信息  
  21.         /// </summary>  
  22.         /// <returns></returns>  
  23.         public IEnumerable<Student> GetAll()  
  24.         {  
  25.             return Articles;  
  26.         }  
  27.         /// <summary>  
  28.         /// 通過ID獲取學生信息  
  29.         /// </summary>  
  30.         /// <param name="id"></param>  
  31.         /// <returns></returns>  
  32.         public Student Get(int id)  
  33.         {  
  34.             return Articles.Find(p => p.Id == id);  
  35.         }  
  36.         /// <summary>  
  37.         /// 添加學生信息  
  38.         /// </summary>  
  39.         /// <param name="item"></param>  
  40.         /// <returns></returns>  
  41.         public Student Add(Student item)  
  42.         {  
  43.             if (item == null)  
  44.             {  
  45.                 throw new ArgumentNullException("item");  
  46.             }  
  47.             Articles.Add(item);  
  48.             return item;  
  49.         }  
  50.         /// <summary>  
  51.         /// 更新學生信息  
  52.         /// </summary>  
  53.         /// <param name="item"></param>  
  54.         /// <returns></returns>  
  55.         public bool Update(Student item)  
  56.         {  
  57.             if (item == null)  
  58.             {  
  59.                 throw new ArgumentNullException("item");  
  60.             }  
  61.  
  62.             int index = Articles.FindIndex(p => p.Id == item.Id);  
  63.             if (index == -1)  
  64.             {  
  65.                 return false;  
  66.             }  
  67.             Articles.RemoveAt(index);  
  68.             Articles.Add(item);  
  69.             return true;  
  70.         }  
  71.         /// <summary>  
  72.         /// 刪除學生信息  
  73.         /// </summary>  
  74.         /// <param name="id"></param>  
  75.         /// <returns></returns>  
  76.         public bool Delete(int id)  
  77.         {  
  78.             Articles.RemoveAll(p => p.Id == id);  
  79.             return true;  
  80.         }  
  81.     }  

(3)最后添加控制器StudentController,并注入依賴代碼

  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Web;  
  5. using System.Web.Mvc;  
  6. using AtuoFacOfMVC4.Models;  
  7.  
  8. namespace AtuoFacOfMVC4.Controllers  
  9. {  
  10.     public class StudentController : Controller  
  11.     {  
  12.         readonly IStudentRepository repository;  
  13.         //構造器注入  
  14.         public StudentController(IStudentRepository repository)  
  15.         {  
  16.             this.repository = repository;  
  17.         }  
  18.  
  19.         public ActionResult Index()  
  20.         {  
  21.             var data = repository.GetAll();  
  22.             return View(data);  
  23.         }  
  24.  
  25.     }  

(4)最后為控制器StudentController的Index方法添加視圖即可,這里不再詳述,運行效果如下

*將自己學習的點滴記錄并分享出來,既能使自己得到成長,偶爾也能幫助一下別人,何樂而不為呢?如果這篇文章對你還有點用的話,希望幫忙推薦一下~

原文鏈接:http://www.cnblogs.com/WeiGe/p/3871451.html

責任編輯:林師授 來源: 王威的博客
相關推薦

2010-06-23 15:44:03

ASP.NET MVC

2009-07-31 12:43:59

ASP.NET MVC

2010-06-25 08:51:46

ASP.NET MVC

2011-08-24 09:43:06

ASP.NET MVC

2009-07-24 13:20:44

MVC框架ASP.NET

2012-05-09 13:29:42

ASP.NET

2009-07-28 17:17:19

ASP.NET概述

2009-07-20 10:53:59

ASP.NET MVC

2009-07-23 15:44:39

ASP.NET MVC

2009-07-23 14:31:20

ASP.NET MVC

2009-07-22 13:24:24

ASP.NET MVC

2009-07-22 10:09:59

ASP.NET MVC

2009-07-20 16:44:56

ASP.NET MVCIValueProvi

2010-10-18 09:03:44

ASP.NET MVC

2009-07-30 13:45:40

ASP.NET開發(fā)模式MVC模式

2014-06-30 15:10:32

2010-06-23 08:56:58

ASP.NET MVC

2009-07-22 10:13:31

異步ActionASP.NET MVC

2009-04-01 12:00:43

ASP.NETMVC

2009-07-20 15:44:32

ASP.NET MVC
點贊
收藏

51CTO技術棧公眾號

午夜精品久久久久久久久久久| 一区二区三区欧美激情| 日韩最新在线视频| 亚洲欧美制服另类日韩| 中文字幕在线视频观看| 成人一区在线看| 久久伊人一区| 国产乱码精品一区二区三区四区 | 秋霞毛片久久久久久久久| 要久久爱电视剧全集完整观看| 亚洲色图35p| 欧美xxxx做受欧美88bbw| 欧美性色19p| 久草在线资源视频| 一区二区不卡在线播放| 成年人视频观看| 丁香婷婷综合激情五月色| 中文字幕99| 韩国成人在线视频| 大地资源网在线观看免费官网| 爽爽淫人综合网网站| 欧美激情第一页在线观看| 很黄很黄激情成人| 亚洲综合精品一区二区| 国精品一区二区三区| 国产一级特黄a大片99| 国产日韩高清一区二区三区在线| 精品国产乱码一区二区三区四区 | 91国偷自产一区二区三区观看| 国产免费视频| 亚洲精品菠萝久久久久久久| 成人伦理视频网站| 亚洲高清三级视频| 天堂а√在线8种子蜜桃视频 | 欧美性xxxxxx| 女人偷人在线视频| 欧美日韩国产小视频| 国产区在线看| 欧美一级二级三级乱码| 成人影音在线| 日韩在线免费视频| 狠狠久久伊人| 日本精品视频在线观看| 91日韩在线| 黄色手机在线视频| 欧美国产三级| 精品国产乱码一区二区三区四区| 国产亚洲在线观看| 在线丝袜欧美日韩制服| av网站免费线看精品| 香港日本韩国三级网站| 依依成人精品视频| av午夜在线| 亚洲欧美国产一区二区三区| 日韩欧美第二区在线观看| 黄色成人91| 色噜噜狠狠一区二区三区| 国模娜娜一区二区三区| 日韩av手机版| 日本道免费精品一区二区三区| av毛片午夜不卡高**水| 久久99青青精品免费观看| 久久一区91| 亚洲免费不卡| 国产精品久久久久婷婷二区次| 色鬼7777久久| 亚洲人成欧美中文字幕| 哺乳一区二区三区中文视频| 91精品在线一区| 国产高清久久久| 传媒在线观看| 亚洲黄色av网站| 欧美精品密入口播放| 精品久久sese| 国产欧美一区二区精品婷婷| 精华区一区二区三区| 国产一区二区日韩精品欧美精品| 国产精品自拍区| 97中文字幕在线| 欧美日韩在线第一页| 欧美特黄色片| 国产一区二区三区四区hd| 久久久久久久久岛国免费| 一广人看www在线观看免费视频| 久久九九亚洲综合| 亚洲综合99| 男人天堂v视频| 国产亚洲精品91在线| 精品999成人| 国产91大片| 亚洲天堂av在线播放| 欧美日韩蜜桃| 成人网18入口| 中文字幕亚洲字幕| 国产亚洲欧洲| 成人动漫av| 久久91精品国产| 久久99最新地址| 国产一区二区影视| 午夜精品一区二区三区在线| 久久av资源网| h视频在线播放| 日韩av免费在线看| av网站免费线看精品| www欧美xxxx| 国产伦精品一区二区三区免| 亚洲青青青在线视频| 欧美大陆国产| 一区精品视频| 欧美另类z0zxhd电影| 色婷婷综合网| 亚洲精品午夜在线观看| 国产一区二区三区日韩欧美| 国产九九精品| 午夜亚洲成人| 国产精品pans私拍| 中日韩免费视频中文字幕| 外国电影一区二区| 在线观看日韩片| 日韩欧美激情一区| 99这里有精品| 91大神xh98hx在线播放| 95av在线视频| 亚洲成a人片在线不卡一二三区| 久久精品色播| 午夜免费一区二区| 欧美另类极品videosbest最新版本 | 国产一区亚洲一区| 四季久久免费一区二区三区四区| 亚洲综合自拍一区| 亚洲va欧美va天堂v国产综合| 99精品国产高清一区二区麻豆| 人妻久久久一区二区三区| 亚洲一区二区黄| 国产精品影视在线观看| 都市激情国产精品| 美国av在线播放| 亚洲欧美国产一本综合首页| 国产乱子伦视频一区二区三区 | 免费国产在线精品一区二区三区| 欧美三级xxx| 欧美aⅴ99久久黑人专区| 精品视频二区| 国产高清精品一区二区| 欧美日韩一级二级| 亚洲影院一区| wwww亚洲| 91免费国产精品| xxxxx成人.com| 欧美激情一区二区三区全黄| 偷拍自拍一区| 在线理论视频| 精品欧美一区二区久久久伦| 91精品婷婷国产综合久久性色| 久久看片网站| 色尼玛亚洲综合影院| 成人久久久久久久久| 5278欧美一区二区三区| 欧美日韩国产一区中文午夜| 99国产精品自拍| 18aaaa精品欧美大片h| 91精品国产91久久久久麻豆 主演| 精品国产一区av| 国产精品美女久久久久高潮| 欧美gvvideo网站| 亚洲资源一区| 波多野结衣50连登视频| 国产精品成av人在线视午夜片| 日韩欧美一区二区三区久久| 另类欧美日韩国产在线| 日韩视频一区二区三区四区| 视频二区在线| 大地资源网在线观看免费官网| 欧美黑人巨大精品一区二区| 亚洲va欧美va人人爽| 日韩高清在线不卡| 成人综合日日夜夜| 日韩大片b站免费观看直播| 日韩中文字幕av在线| 久久99亚洲精品| 欧美亚洲国产一区二区三区| 黑人精品欧美一区二区蜜桃| 国产精品极品在线观看| 日本亚洲精品| 免费黄色特级片| av免费观看久久| 中文字幕日韩在线观看| 天天综合网天天综合色| 麻豆精品一区二区三区| 精品成人自拍视频| 黄色免费在线观看| 国产精品入口免费软件| 久久精品日产第一区二区三区精品版| 中文字幕亚洲综合| 在线一区二区观看| 懂色av一区二区三区免费观看| 欧美激情成人| 欧美成人福利| 亚洲丝袜精品| 久草热久草在线频|