IoC:注册、注入(解析)、生命周期
Autofac的基本使用
基本使用
需要在NuGet包安装Autofac---建议7.1.0版本
注册:
默认注册:
// 容器的初始化
ContainerBuilder builder = new ContainerBuilder();
// 注册需要解析的对象类型 -- 默认不是单例模式
builder.RegisterType<Person>();
IContainer container = builder.Build();
// 实现 --------
Person person = container.Resolve<Person>();
单例:需要传参:初始化这个对象
ExternallyOwned:告诉这个容器永远不会释放这个容器
builder.RegisterInstance<Person>(new Person()).ExternallyOwned();
// 实现 ----------
Person person = container.Resolve<Person>();
Lambda表达式
泛型类
最基本的基于接口的注册:相同的接口类型,后面的注册会覆盖前面的
PreserveExistingDefaults:当前注册为非默认值
builder.RegisterType<Man>().As<IPerson>().PreserveExistingDefaults();
// 实现 --------
IPerson person = container.Resolve<IPerson>();
单接口多实现:
同过Named
builder.RegisterType<Man>().Named<IPerson>("Man");
builder.RegisterType<Woman>().Named<IPerson>("Woman");
// 使用-------
IPerson person = container.ResolveNamed<IPerson>("Man");
同过Keyed
builder.RegisterType<Man>().Keyed<IPerson>(PersonType.Man);
builder.RegisterType<Woman>().Keyed<IPerson>(PersonType.Woman);
// 使用 ---------
IPerson person = container.ResolveKeyed<IPerson>(PersonType.Man);
也是用Keyed,获取到所有的PersonType, IPerson的实例 ,然后同过字典的方式调用方法
builder.RegisterType<Man>().Keyed<IPerson>(PersonType.Man);
builder.RegisterType<Woman>().Keyed<IPerson>(PersonType.Woman);
// 使用-----------
// ps就是所有接口的实现
var ps = container.Resolve<IIndex<PersonType, IPerson>>();
ps[PersonType.Man].SayHello();
ps[PersonType.Woman].SayHello();
索引
构造函数选择:
UsingConstructor:使用构造函数的类型是什么
builder.RegisterType<Man>().As<IPerson>().UsingConstructor(typeof(string));
// 使用 --------
// 通过 NamedParameter 进行传值 通过key value
IPerson person = container.Resolve<IPerson>(new NamedParameter("arg", "1111"));
注入:和普通的IOC注入方式一样
基本注入
属性注入
方法注入
Resolve参数
对象释放
绑定事件
生命周期
builder.RegisterType<Man>().As<IPerson>()
.OnRegistered(e => Console.WriteLine("在注册的时候调用!"))
.OnPreparing(e => Console.WriteLine("在准备创建的时候调用!"))
.OnActivating(e => Console.WriteLine("在创建之前调用!"))
.OnActivated(e => Console.WriteLine("在创建之后调用!"))
.OnRelease(e => Console.WriteLine("在释放占用的资源之前调用!"));
MVVM应用中的使用
在MVVM应用中的ViewModelLocator中:
public class ViewModelLocator
{
IContainer container;
public ViewModelLocator()
{
// 注册
ContainerBuilder builder = new ContainerBuilder();
builder.RegisterType<MainViewModel>();
container = builder.Build();
}
public MainViewModel MainViewModel { get => container.Resolve<MainViewModel>(); }
}