IOC概念
Inversion of Control 控制反转(将新建对象的控制权交给容器)
实现方式
Dependency Injection 依赖注入(在运行时将对象注入到指定位置) -常见
Dependency Lookup 依赖查找
使用环境
对于所有新建对象照成的强耦合,使用IOC框架可以降低代码的耦合
(个人结合资料的理解)
以上概念引用:https://segmentfault.com/a/1190000020361476 作者:CoderV的进阶笔记
发布时间:2019-09-11
官方资料
官方网址:https://autofac.org/
快速使用文档:https://autofac.readthedocs.io/en/latest/getting-started/index.html
快速入门代码
参照:https://www.cnblogs.com/zcqiand/p/14257650.html
作者:南荣相如谈编程
对官方示例进行了简化
运行环境:.net core 3.1
class Program{static void Main(string[] args){//构造器var builder = new ContainerBuilder();//注册builder.RegisterType<MyModel1>();builder.RegisterType<MyModel2>();//容器IContainer container = builder.Build();//使用范围using (var scope = container.BeginLifetimeScope()){//解析实例var actor = scope.Resolve<MyModel1>();actor.Output();}Console.ReadKey();}}interface MyModel{void Output();}class MyModel1 : MyModel{public void Output(){Console.WriteLine("MyModel1");}}class MyModel2 : MyModel{public void Output(){Console.WriteLine("MyModel2");}}
添加接口使用
class Program{static void Main(string[] args){//构造器var builder = new ContainerBuilder();//注册类型并指定名称builder.RegisterType<MyModel1>().Named<MyModel>("my1");builder.RegisterType<MyModel2>().Named<MyModel>("my2");//接口只有一个实例时可以不用名称builder.RegisterType<MyTest>().As<Testfac>();//容器IContainer container = builder.Build();//使用范围using (var scope = container.BeginLifetimeScope()){//解析实例var actor = scope.ResolveNamed<MyModel>("my1");var actor2 = scope.Resolve<Testfac>();actor.Output();actor2.Ts();}Console.ReadKey();}}interface MyModel{void Output();}class MyModel1 : MyModel{public void Output(){Console.WriteLine("MyModel1");}}class MyModel2 : MyModel{public void Output(){Console.WriteLine("MyModel2");}}interface Testfac{public void Ts();}class MyTest : Testfac{public void Ts(){Console.WriteLine("MyTest");}}
从程序集扫描并装载(注册)
class Program{static void Main(string[] args){//构造器var builder = new ContainerBuilder();//注册类型并指定名称//builder.RegisterType<MyModel1>().Named<MyModel>("my1");//builder.RegisterType<MyModel2>().Named<MyModel>("my2");//接口只有一个实例时可以不用名称//builder.RegisterType<MyTest>().As<Testfac>();//从程序集扫描并注册var dataAccess = System.Reflection.Assembly.GetExecutingAssembly();builder.RegisterAssemblyTypes(dataAccess).Where(t => t.Name.StartsWith("MyModel1")).Named<MyModel>("my1");builder.RegisterAssemblyTypes(dataAccess).Where(t => t.Name.StartsWith("MyModel2")).Named<MyModel>("my2");builder.RegisterAssemblyTypes(dataAccess).Where(t => t.Name.StartsWith("MyTest")).PublicOnly() /*只扫描公开类*/.As<Testfac>();//容器IContainer container = builder.Build();//使用范围using (var scope = container.BeginLifetimeScope()){//解析实例var actor = scope.ResolveNamed<MyModel>("my1");var actor2 = scope.Resolve<Testfac>();actor.Output();actor2.Ts();}Console.ReadKey();}}interface MyModel{void Output();}class MyModel1 : MyModel{public void Output(){Console.WriteLine("MyModel1");}}class MyModel2 : MyModel{public void Output(){Console.WriteLine("MyModel2");}}interface Testfac{public void Ts();}public class MyTest : Testfac{public void Ts(){Console.WriteLine("MyTest");}}
