代码改变世界

依赖注入容器-Autofac

2014-10-09 15:57  看看能坚持多久!  阅读(271)  评论(0编辑  收藏  举报

              介绍一款依赖注入的容器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 DBMange
16     {
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             else
18             {
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