Autofac 学习笔记草书 1 --- 初识
2013-03-18 00:18 Shawn.Cheng 阅读(357) 评论(1) 编辑 收藏 举报接口ILog
1 public interface ILog 2 { 3 void Create(string log, params object[] paramters); 4 }
实现类PrintLoger
1 public class PrintLoger:ILog 2 { 3 protected TextWriter TW{get;set;} 4 5 public PrintLoger(TextWriter tw) 6 { 7 this.TW=tw; 8 } 9 10 public void Create(string log,params object[] paramters) 11 { 12 if(log==null) 13 return; 14 15 string Log=string.Format(log,paramters); 16 TW.WriteLine(Log); 17 } 18 }
Program测试与理解
1 class Program 2 { 3 static void Main(string[] args) 4 { 5 Program p = new Program(); 6 p.Test4(); 7 8 Console.Read(); 9 } 10 11 public void Test1() 12 { 13 var builder = new ContainerBuilder(); 14 15 builder.RegisterInstance(Console.Out).As<TextWriter>().ExternallyOwned();//code 0 16 //builder.RegisterInstance(Console.Out);---同使用此句是相同的效果 17 //应该是将一个组件(实例)注册到一个服务上?如果没有指明as,那么将会是默认的服务上? 18 19 using (var container = builder.Build()) 20 { 21 //请求构造该服务上的一个组件的一个实例 ,发现是out 22 container.Resolve<TextWriter>().WriteLine("hello console.out->textwriter"); 23 } 24 } 25 26 public void Test2() 27 { 28 var builder = new ContainerBuilder(); 29 builder.RegisterInstance(Console.Out).As<TextWriter>().ExternallyOwned();//code 0 30 31 builder.RegisterType<PrintLoger>().As<ILog>();// code 1 32 33 using (var container2 = builder.Build()) 34 { 35 //请求Ilog的服务,将会构造相应注册组件的一个实例 36 //由于code 1 中 将组件PrintLoger 注册到Ilog服务上,则将会尝试构造PrintLoger实例 37 //使用其构造函数,将会请求TextWriter服务,由于code0 将 TextWriter 注册到该 TextWriter服务上,并且指明了实例为Out 38 //则构造参数TextWriter 的实例为Console.Out,构造成功 39 container2.Resolve<ILog>().Create("this is log :{0}", "Ilog-printerloger"); 40 41 //请求PrintLoger服务,在Containter中并未找到相应的组件,无法构造实例,将会报错 42 container2.Resolve<PrintLoger>().Create("this is log :{1}", "printerloger"); 43 } 44 } 45 46 public void Test3() 47 { 48 var builder = new ContainerBuilder(); 49 builder.RegisterInstance(Console.Out).As<TextWriter>().ExternallyOwned();//code 0 50 51 52 builder.RegisterType<PrintLoger>().As<PrintLoger>();//code3 53 54 using (var container3 = builder.Build()) 55 { 56 //请求PrintLoger服务,由于code3注册组件PrintLoger到服务PrintLoger上,构造实例 由于code0使用 参数Console.out ,实例构造成功 57 container3.Resolve<PrintLoger>().Create("this is log:{0}", "printerloger11"); 58 } 59 } 60 61 public void Test4() 62 { 63 var builder = new ContainerBuilder(); 64 65 PrintLoger ploger = new PrintLoger(Console.Out); 66 //builder.RegisterInstance(ploger).As<PrintLoger>(); 67 builder.RegisterInstance(ploger); 68 69 using (var container3 = builder.Build()) 70 { 71 //请求PrintLoger服务,由于code3注册组件PrintLoger到服务PrintLoger上,构造实例 由于code0使用 参数Console.out ,实例构造成功 72 container3.Resolve<PrintLoger>().Create("this is log:{0}", "printerloger44"); 73 } 74 } 75 }
总结
重要的是理解组件和服务。Register 主要是将组件注册到服务,做一个映射。一个组件通常是以类,而一个服务通常是一个接口,也可以是一个类。Resolver会向Container中请求服务,而Container会查找其中注册到该服务的组件,并构造该组件的实例,如果注册的时候声明了实例,则使用该实例,如果没有,则会使用其默认的构造函数。如果函数内有参数,同样的原理,Container会继续寻找其组件,构造实例,完成原有服务组件的实例化。
初识总结,难免有错误不恰当之处,务必请来者慎思而观,以免误导。若有来者纠误指点,定当欣喜,谢之。
后若观之有误,则将改之。