Autofac容器

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>(); }
 }
  • 9
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值