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");
}
}