介绍一款依赖注入的容器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 }
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 }
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 }
上面的卖家中只有一种水果就是苹果,那如果有多种水果会出现什么情况呢?
//上面的错误大概意思就是卖家不知道该给你哪一种水果了 //所以必须指出你具体需要的水果的名称
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