首页 > 代码库 > 依赖注入容器-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 }
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 }
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
依赖注入容器-Autofac