ASP.NET MVC IOC 之AutoFac攻略

Autofac是.NET领域最为流行的IOC框架之一,既然它都这么牛X了,我们用它就理所当然了,所以推荐其为IOC的终极解决方案!
一、为什么使用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的使用6 g
首先你必须获取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. public class SqlDAL : IDAL  & ]. ^1 E% `; Q$ q1 a) p
  2. {  
  3.     public void Insert(string commandText)  $ I' \" L# f) z: y( d
  4.     {  ; r" \" m6 r5 W% T7 M) p0 d
  5.         Console.WriteLine("使用sqlDAL添加相关信息");  
  6.     }  
复制代码$ }; W9 E+ ^1 ?* e: m8 u
Oracle方式:; k/ w# K( ]* M  r6 X- n
  1. public class OracleDAL : IDAL  ( T- f: [- F8 h: I# r. P" j; ^
  2. {  ' A1 [  W5 R% w
  3.     public void Insert(string commandText)  + h- K. Y( d1 Z. R: r& A
  4.     {  . x/ C  f  H% N9 G9 m4 Y
  5.         Console.WriteLine("使用OracleDAL添加相关信息");  " O# a! y3 W0 C+ h1 ]" {9 [# @4 j
  6.     }  
复制代码
) Y! [9 ^. X" y, `1 ?* t. G- m
然后注入实现构造函数注入:3 s8 w3 I, q3 P1 z; g
  1. public class DBManager   
  2. {   
  3.     IDAL _dal;  $ W1 Y; W2 s' v. v
  4.     public DBManager(IDAL dal)   % B3 c" l* E& p9 T. y
  5.     {   
  6.         _dal= dal;  
  7.     }  3 B* U4 G0 G$ i- J- ~
  8. public void Add(string commandText)   4 W) u2 @. W$ c3 C! S8 g
  9.     {   7 O! {9 _' B% n; p. _
  10.         _dal.Insert(commandText);     r1 r. }# Z: ]
  11.     }  ; W3 E+ H2 T9 T1 h, o( o  }
复制代码

最后要真正完成依赖注入就得AtuoFac登场了:
  1. var builder = new ContainerBuilder();   5 P: G; }9 N( _+ C, e- v% p7 g
  2. builder.RegisterType<DBManager>();   
  3. builder.RegisterType<SqlDAL>().As<IDAL>();   
  4. using (var container = builder.Build())   
  5. {   
  6.     var manager = container.Resolve<DBManager>();   ) ~) m" x  d+ y0 Y
  7.     manager.Add("INSERT INTO Persons VALUES ('Man', '25', 'WangW', 'Shanghai')");   0 n' e5 V, ?6 _2 `
复制代码
/ C/ O$ z  w2 z! s
从以上栗子可以看出,其实AutoFac的使用跟Unity的使用有点像,关键的东东就是这个Container容器类
2、AutoFac常用方法说明* k' B# `. O3 U
(1)builder.RegisterType<Object>().As<Iobject>():注册类型及其实例。例如下面就是注册接口IDAL的实例SqlDAL6 z* v1 Y  H  a: y8 N3 R3 }' G7 c
  1. ContainerBuilder builder = new ContainerBuilder();  
  2. builder.RegisterType<SqlDAL>().As<IDAL>();  
  3. IContainer container = builder.Build();  9 i, x' a$ [# ?. E; X; [- q
  4. SqlDAL sqlDAL = (SqlDAL)container.Resolve<IDAL>(); 
复制代码+ l/ W4 u( D1 q) X2 E# w: S
(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");  ( J9 W0 S8 L3 x* x: c2 m- B; z, d
  3. IContainer container = builder.Build();  3 n% U' ]0 L1 K, z; r- Z0 e
  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):以枚举的方式为一个接口注册不同的实例。有时候我们会将某一个接口的不同实现用枚举来区分,而不是字符串,例如:4 Y2 d4 @  h; x7 E# U
  1. public enum DBType{ Sql, Oracle} 
复制代码
  1. builder.RegisterType<SqlDAL>().Keyed<IDAL>(DBType.Sql);  ' ?& v$ ?2 Q9 ?- W  X2 D
  2. builder.RegisterType<OracleDAL>().Keyed<IDAL>(DBType.Oracle);  
  3. IContainer container = builder.Build();  7 r* |( m2 r* b7 e8 E4 b4 }
  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():用于控制对象的生命周期,每次加载实例时都是新建一个实例,默认就是这种方式3 M0 j6 w. E) B% s  L
(8)builder.RegisterType<Worker>().SingleInstance():用于控制对象的生命周期,每次加载实例时都是返回同一个实例
(9)IContainer.Resolve<T>(NamedParameter namedParameter):在解析实例T时给其赋值
  1. DBManager manager = container.Resolve<DBManager>(new NamedParameter("name", "SQL")); 
复制代码  H6 ~' P- _, M) C. |
  1. public class DBManager   ) r! s- {" N+ |$ t
  2. {     
  3.     IDAL dal;  
  4.     public DBManager (string name,IDAL  _dal)  . E3 K( V. J+ A5 M0 E6 s% Z
  5.     {  
  6.         Name = name;  
  7.         dal= _dal;  - d) u* S$ m- i4 N
  8.     }  + K1 Y' n3 y4 ?. u2 ^. z! e, ~* o& O
复制代码$ _* [* C: V) E2 @" n# b& t
3、通过配置的方式使用AutoFac7 c( `% x4 N* X2 ^; X2 ?. ~$ U
(1)先配置好配置文件
  1. <?xml version="1.0"?> 
  2. <configuration> 
  3.   <configSections> 
  4.     <section name="autofac" type="Autofac.Configuration.SectionHandler, Autofac.Configuration"/> 9 D  z9 v5 [" l2 V( j
  5.   </configSections> 
  6.   <autofac defaultAssembly="ConsoleApplication1"> 
  7.     <components> 
  8.       <component type="ConsoleApplication1.SqlDAL, ConsoleApplication1" service="ConsoleApplication1.IDAL" /> 
  9.     </components> 
  10.   </autofac> 
  11. </configuration> 
复制代码
(2)读取配置实现依赖注入(注意引入Autofac.Configuration.dll)+ P  {5 l: f2 e5 a8 e- f! Q
  1. static void Main(string[] args)  
  2.     {  7 [' Z7 n' L! ~# H3 s+ H: H
  3.         ContainerBuilder builder = new ContainerBuilder();  0 v, q" ~8 G% e" q7 G- W/ h! w
  4.         builder.RegisterType<DBManager>();  2 f7 q3 G7 [' }# }3 H' n
  5.         builder.RegisterModule(new ConfigurationSettingsReader("autofac"));  1 F" x6 p& v) E4 z+ o' p- `/ J- L
  6.         using (IContainer container = builder.Build())  
  7.         {  
  8.             DBManager manager = container.Resolve<DBManager>();  & w- |( k0 H" A; a/ Q
  9.             manager.Add("INSERT INTO Persons VALUES ('Man', '25', 'WangW', 'Shanghai')");   
  10.     }  

有点乱,此处只做记录,具体请查看原贴

转载于:https://my.oschina.net/dyc1122/blog/1358773

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值