控制反转:把传统上由程序代码直接操控的对象的调用权交给容器,通过容器来实现对象组建的装配和管理。
(对组件对象控制权的转移,从程序代码本身转移到外部容器)
常用的IoC组件有:
spring.net ,
Unity,
Castle Windsor,
Autofac,
StructureMap,
Ninject
由于网上各方评论都说Autofac效率较高,所以先写一个demo,激励一下自己以后继续写博客。。。
demo
1 var container = new ContainerBuilder(); // 建立容器 2 container.RegisterType<DbRespository>(); // 在容器中注册信息 3 container.RegisterType<SqlServerRespository>().AsImplementedInterfaces(); 4 //container.RegisterType<RedisRespository>().AsImplementedInterfaces(); 5 //container.RegisterInstance(new RedisRespository()).AsImplementedInterfaces(); 6 7 // 从App.config 文件进行读取 8 container.RegisterModule(new ConfigurationSettingsReader("autofac")); 9 10 using (var obj = container.Build()) 11 { 12 var manager = obj.Resolve<DbRespository>(); 13 manager.Execute(); 14 } 15 Console.Read();
在外部文件App.config进行配置
1 <configSections> 2 <section name="autofac" type="Autofac.Configuration.SectionHandler,Autofac.Configuration" /> 3 </configSections> 4 <startup> 5 <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" /> 6 </startup> 7 8 <autofac defaultAssembly="AutofacDemo"> 9 <components> 10 <component type="AutofacDemo.OracleRespository, AutofacDemo" service="AutofacDemo.IRespository" /> 11 </components> 12 </autofac>
通过以上代码,不难看出。建立的container容器,通过Autofac引入外部文件,然后完成IOC的反转控制。
跳到内部你会发现,其实内部就是通过反射生成对应的类,完成外部的控制。
看来,以后得深入研究一下反射了。。。