首页 > 代码库 > 依赖注入容器-Autofac

依赖注入容器-Autofac

              介绍一款依赖注入的容器AutoFac,一直非常迷惑依赖注入到底有独特的优势或者好处,感觉如果用策略模式和反射等也是可以实现这个解耦的,不管怎么样还是先来大概了解依赖注入到底是怎么一回事。
             首先来看个例子,如果你想要一把锤子你会怎么做?(这个例子是我百度上看到的,觉得挺形象的)

                                1.自己造,打铁,锻造等。

                               2.或者你找制造锤子的工厂订购

                               3.打开淘宝,下单,支付

              上面的例子在程序开发中分别有什么不同:第一种方式显而易见非常麻烦,从开发角度看就是高度耦合,导致使用和制造混在一起,一旦代码变动很难重复使用。第二种方式相对来说比较方便了,需要什么只需要找到对应的制造商,类似开发中的接口编程。第三种方式是最为方便的,淘宝上应有尽有而这个淘宝就是这个容器,淘宝卖家上架了商品,然后你只需要根据你的需要找到这个商品下单即可,无需弄清楚卖家是通过什么渠道获得的商品,而这个就是依赖注入容器的优势。

             autofac是一款轻量级的ioc框架,接下去我简单介绍下如何使用.

       
 1     public class Apple:IFruits 2     { 3         public string Get(string sql) 4         { 5             return "苹果"; 6         } 7     } 8     public class Banana: IFruits 9     {10         public string Get(string sql)11         {12             return "香蕉";13         }14     }15     public class DBMange16     {17         public IFruits_dal;18         //构造函数需要一个水果接口   相当于制造商        public DBMange(IFruits dal)19         {20             _dal = dal;21         }22         public string Get()23         {24             return  _dal.Get("");25         }26     }
View Code
       
 1     /// <summary> 2     /// 单例模式 3     /// </summary> 4     public class AutofacContainer 5     { 6         private static ContainerBuilder buider = null; 7         /// <summary> 8         /// 考虑线程安全 9         /// </summary>10         private static readonly object LockHelper = new object();11         public ContainerBuilder Createbuilder()12         {13             if (buider != null)14            {15                 return buider;16            }17             else18             {19                 lock (LockHelper)20                 {21                    var builder = new ContainerBuilder();22                     //注入DBMange    相当于淘宝卖家                    23                      builder.RegisterType<DBMange>();24                     //注入苹果         结合上面的例子 相当于就是需要的锤子                  25                     builder.RegisterType<Apple>().As<IFruits>();26                     buider = builder;27                     return buider;28                 }29             }30         }    31     }
View Code
       
1 //autofacContainer    相当于淘宝2 AutofacContainer autofacContainer = new AutofacContainer();3 using (var container = autofacContainer.Createbuilder().Build())4 {5    //从淘宝(container)中找到卖家(DBMange)  至于制造商就不管了 这是卖家该关心的事了6     ValID.Text = container.Resolve<DBMange>().Get();7 }
View Code

             上面的卖家中只有一种水果就是苹果,那如果有多种水果会出现什么情况呢?

           

             //上面的错误大概意思就是卖家不知道该给你哪一种水果了 //所以必须指出你具体需要的水果的名称
              builder.RegisterType<Apple>().Named<IFruits>("apple");--注入的时候先说明,然后按名称获取
              builder.RegisterType<Banana>().Named<IFruits>("banana");(Apple)container.ResolveNamed<IFruits>("apple").Get("");----输出为苹果

             //当然淘宝上有非常多的卖水果的卖家 如何选择那一个卖家 也是一样的道理

             上面简单介绍了下autofac,也大概说明了容器的优势,仅供参考。(上面的例子是网上的,数据库选择版本稍微改动了下)

              我参考的数据库选择的版本:http://www.cnblogs.com/liping13599168/archive/2011/07/16/2108209.html

依赖注入容器-Autofac