.NET Core开发实战学习笔记--使用 Autofac 增强容器能力

什么情况下需要引入第三方容器组件?

实际上是大部分情况默认的容器组件是够我们使用的,当我们需要一些特殊的场景比如:

  • 基于名称的注入:我们需要按照名称来区分它不同的实现的时候
  • 属性注入:直接把服务注册到某一个类的属性里面去,而不需要定义构造函数
  • 子容器
  • 基于动态代理的AOP:当我们需要在服务中注入我们额外的行为的时候

 .Net Core 的依赖注入框架的核心扩展点

public interface IServiceProviderFactory<TContainerBuilder>

第三方的依赖注入容器都是使用了这个类作为扩展点,把自己注入到我们整个的框架里面来。

为什么选择Autofac?

Autofac是.NET社区下面最老牌的容器框架之一,本人在项目中用得最多的也是Autofac。常用的Ioc和Aop器还有Unity、Spring.Net。

Autofac的核心组件包

  • Microsoft.Extensions.Configuration. Abstractions
  • Microsoft.Extensions.Configuration

我们可以通过NuGet进行安装。

配置Autofac容器

我们需要在我们的Program入口加一行代码,就是UseServiceProviderFactory(new AutofacServiceProviderFactory())

另外我们还需要在Startup添加一个方法ConfigureContainer,他的入参是Autofac的ContainerBuilder

Autofac的注册方式

它的注册方式与.Net Core默认容器的注册方式是略有不同的

我们先注册具体的实现,然后再告我们想把它标记为哪个服务的类型

builder.RegisterType<MyService>().As<IMyService>();

 命名注册

当我们需要比一个服务注册多次,并且用不同的命名来作为区分的时候我们就可以使用这种方式

builder.RegisterType<MyServiceV2>().Named<IMyService>("service2");

属性注册

属性注册只需要在末尾加上.PropertiesAutowired()即可

builder.RegisterType<MyServiceV2>().As<IMyService>().PropertiesAutowired();

AOP场景

AOP主要应用场景是指我们在不期望改变原有类的情况下,在方法执行时嵌入一些逻辑,让我们可以在方法执行的切面上任意的插入我们的逻辑。

AOP切面的创建

我们新建一个MyInterceptor的类并继承IInterceptor接口。IInterceptor是Autofac的面向切面的最重要的一个接口,它可以让把我们的逻辑注入到方法的切面里面去。

    public class MyInterceptor : IInterceptor
    {
        public void Intercept(IInvocation invocation)
        {
            Console.WriteLine($"Intercept before,Method:{invocation.Method.Name}");//方法执行前
            invocation.Proceed();//执行我们的方法
            Console.WriteLine($"Intercept after,Method:{invocation.Method.Name}");//方法执行后
        }
    }

invocation.Proceed();是指我们具体方法的执行,如果这一句不执行的话就相当于把我们的切面方法拦截掉。打个比方我们需要做登录验证,则可以把invocation.Proceed()放到if语句里面,如果验证通过则执行,如果不通过则不执行。

那么显而易见invocation.Proceed()后的代码就是在具体方法执行后执行。

启用AOP切面

把拦截器注册到容器里面去

builder.RegisterType<MyInterceptor>();

注册需要添加AOP切面的服务

builder.RegisterType<MyServiceV2>().As<IMyService>().PropertiesAutowired().InterceptedBy(typeof(MyInterceptor)).EnableInterfaceInterceptors();

InterceptedBy(typeof(MyInterceptor))指开启拦截器,并指定拦截方法为MyInterceptor。

EnableInterfaceInterceptors()开启允许接口拦截器

拦截器又分两种:接口拦截器、类拦截器,我们常用的是接口拦截器,当我们的服务的类型是接口的时候我们就需要使用这种方式。如果我们没有基于接口设计我们的类,而是直接实现类的话我能就需要类拦截器。类拦截器就需要我们把方法设计为虚方法,这样子允许继承类重载的情况下才可以拦截我们的具体方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值