自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

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添加相關(guān)信息");  
  6.     }  

Oracle方式:

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

然后注入實現(xiàn)構(gòu)造函數(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的使用有點像,關(guān)鍵的東東就是這個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 = "計算機科學與技術(shù)", 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.         //構(gòu)造器注入  
  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

責任編輯:林師授 來源: 王威的博客
相關(guān)推薦

2010-06-23 15:44:03

ASP.NET MVC

2010-06-25 08:51:46

ASP.NET MVC

2009-07-31 12:43:59

ASP.NET MVC

2011-08-24 09:43:06

ASP.NET MVC

2009-07-24 13:20:44

MVC框架ASP.NET

2009-07-28 17:17:19

ASP.NET概述

2012-05-09 13:29:42

ASP.NET

2009-07-23 15:44:39

ASP.NET MVC

2009-07-22 10:09:59

ASP.NET MVC

2009-07-23 14:31:20

ASP.NET MVC

2009-07-22 13:24:24

ASP.NET MVC

2009-07-20 10:53:59

ASP.NET MVC

2009-07-20 16:44:56

ASP.NET MVCIValueProvi

2009-07-30 13:45:40

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

2010-10-18 09:03:44

ASP.NET MVC

2010-06-23 08:56:58

ASP.NET MVC

2014-06-30 15:10:32

2009-07-29 09:17:12

jQuery刪除

2009-07-23 11:33:18

2009-07-22 10:13:31

異步ActionASP.NET MVC
點贊
收藏

51CTO技術(shù)棧公眾號