大多数面向对象编程语言,在调用一个类的时候,先要实例化这个类,生成一个对象。如果你在写一个类,过程中要调用到很多其它类,甚至这里的其它类,也要“依赖”于更多其它的类,那么可以想象,你要进行多少次实例化。这就是“依赖”的意思。依赖注入,全称是“依赖注入到容器”, 容器(IOC容器)是一个设计模式,它也是个对象,你把某个类(不管有多少依赖关系)放入这个容器中,可以“解析”出这个类的实例。所以依赖注入就是把有依赖关系的类放入容器(IOC容器)中,然后解析出这个类的实例。
1 using Autofac; 2 using System; 3 using System.Collections.Generic; 4 using System.Linq; 5 using System.Text; 6 7 namespace AutoFace 8 { 9 class program 10 { 11 static void Main(string[] args) 12 { 13 //RegisterType:这个方法可以往container中注册一种类型或映射关系,当我们需要调用该类型的实例时, 14 //container会自动实例化该类型的对象,无需通过new someName方法实例化对象 15 ContainerBuilder builder = new ContainerBuilder(); 16 builder.RegisterType<NSender>(); 17 builder.RegisterType<Mike>().As<IEat, ISay>().InstancePerDependency(); 18 //构建容器来完成对象解析,通过Resolve获取该类型的实例 19 using (var container = builder.Build()) 20 { 21 container.Resolve<IEat>(); 22 NSender nSender = container.Resolve<NSender>();//通过resolve解析到的实例 23 nSender.say = container.Resolve<ISay>();//属性注入 24 nSender.sent(); 25 Console.ReadKey(); 26 27 } 28 29 } 30 } 31 public class NSender 32 { 33 public IEat Eat; 34 public ISay Say; 35 //构造函数注入 36 public NSender(IEat eat) 37 { 38 this.Eat = eat; 39 } 40 //属性注入 41 public ISay say 42 { 43 set { Say = value; } 44 } 45 public void sent() 46 { 47 Eat.ExecuteEat(); 48 Say.ExecuteSay(); 49 } 50 } 51 /// <summary> 52 /// 定义一个吃的接口 53 /// </summary> 54 public interface IEat { void ExecuteEat(); } 55 /// <summary> 56 /// 定义一个说的接口 57 /// </summary> 58 public interface ISay { void ExecuteSay(); } 59 /// <summary> 60 /// Mike会吃也会说 61 /// </summary> 62 public class Mike : IEat, ISay 63 { 64 public void ExecuteEat() 65 { 66 Console.WriteLine("执行Eat...."); 67 } 68 public void ExecuteSay() 69 { 70 Console.WriteLine("执行Say...."); 71 } 72 } 73 74 }