.NET Core - Autofac增强容器能力

简介: .NET Core - Autofac增强容器能力

本节学习利用第三方框架Autofac来增强容器能力,并引入面向切面(AOP)编程的概念。

 

那么,先来了解一下

什么时候需要引入第三方容器组件呢?

  • 基于名称的注入
  • 属性注入
  • 子容器
  • 基于动态代理的AOP

 

核心扩展点

public interface IServiceProviderFactory<TContainerBuilder>

第三方的扩展框架都是基于这个接口做扩展的

 

Autofac扩展包

  • Autofac.Extensions.DependencyInjection
  • Autofac.Extras.DynamicProxy

 

下面,我们就通过代码来演示如何使用Autofac以及使用Autofac来实现上述几种情况。

 

代码演示

首先说一下,代码架构,这里主要是定义了一个接口,然后定义了2个实现该接口的类,其中第二个类包含一个属性,用于验证属性注入。类的代码如下

public interface IMyService 
{
    void show();
}
public class MyService : IMyService
{
    public void show()
    {
        Console.WriteLine($"this is MyService.show,{GetHashCode()}");
    }
}
public class MyServiceV2 : IMyService
{
    public MyNameService myNameService { get; set; }
    public void show()
    {
        Console.WriteLine($"this is MyServiceV2.show,{GetHashCode()},MyNameService是否为空:{myNameService==null}");
    }
}
public class MyNameService { }

 

Autofac使用步骤

1.注册第三方组件入口

在使用第三方组件时,我们需要先通过配置来启用第三方组件,如下,我们在CreateHostBuilder中添加如下语句。

.UseServiceProviderFactory(new AutofacServiceProviderFactory())

2.服务注册入口

组件入口注册后,我们需要定义第三方组件自己的服务注册入口,我们可以在startup里新增一个ConfigureContainer方法来实现,方法入参是Autofac.ContainerBuilder,其实,这里我们的服务注册进默认的容器后,会被Autofac接替,然后执行ConfigureContainer.

public void ConfigureContainer(ContainerBuilder containerBuilder)
{
    //...
}

3.接收Autofac的容器

之后,我们需要创建一个作用域,用于在根容器内接收Autofac的容器对象。

public ILifetimeScope AutofacContainer { get; private set; }
//根容器获取
this.AutofacContainer = app.ApplicationServices.GetAutofacRoot();

到这里,我们就完成了所有的准备步骤,可以开始上述几种场景的演示了。

 

常规注入

在这之前,我们先了解一下常规注入方式以及获取方式,这里注意一下,Autofac的注入方式是先注入服务在指定其类型。如下

//常规注册
containerBuilder.RegisterType<MyService>();//未指定类型,通过IMyService不能获取
containerBuilder.RegisterType<MyService>().As<IMyService>();
containerBuilder.RegisterType<MyServiceV2>().As<IMyService>();

获取方式如下

var service = this.AutofacContainer.Resolve<IMyService>();

Autofac的服务获取方式是一组以Resolve...开头的方法,比如,下面要说的命名服务的获取方式可通过ResolveNamed方法获取。

 

基于名称的注入及获取

//注册
containerBuilder.RegisterType<MyService>().Named<IMyService>("myService");
//获取
IMyService myService = this.AutofacContainer.ResolveNamed<IMyService>("myService");

属性注入

属性注通过PropertiesAutowired来开启属性注入,在属性注入前要先注册要注入的服务

//注入要注入的服务
containerBuilder.RegisterType<MyNameService>();
//开启属性注入
containerBuilder.RegisterType<MyServiceV2>().As<IMyService>().PropertiesAutowired();

AOP编程

Autofac提供了一个IInterceptor的接口,用于提供AOP的能力,我们可以通过实现该接口,将一些特定的逻辑嵌入到方法的切面中,并控制是否执行原有代码逻辑,一般,我们称该类为拦截器,如下,是一个拦截器示例

public class Interceptor : IInterceptor
{
    public void Intercept(IInvocation invocation)
    {
        Console.WriteLine($"{invocation.Method.Name}执行前");
        //不调用该方法,可禁用原有逻辑
        invocation.Proceed();
        Console.WriteLine($"{invocation.Method.Name}执行后");
    }
}

那么,如何开启拦截器呢?主要有以下几步

  1. 注入拦截器
  2. 通过InterceptedBy来定义允许的类型
  3. 开启拦截器开关,分为类拦截器和接口拦截器(常用)

代码如下:

//注入拦截器
containerBuilder.RegisterType<Interceptor>();
//定义允许的类型并开启拦截器
containerBuilder.RegisterType<MyService>().As<IMyService>().InterceptedBy(typeof(Interceptor)).EnableInterfaceInterceptors();

子容器

我们知道,通过Scope可以创建子容器,在Autofac中,可以通过InstancePerMatchingLifetimeScope来创建特定名称的子容器,一般使用在期望某一服务不在根容器创建,但又希望它在一定的范围内是单例的情况下。

containerBuilder.RegisterType<MyServiceV2>().InstancePerMatchingLifetimeScope("myscope");

也可以通过如下代码来验证容器是否是单例

using (var myscope = AutofacContainer.BeginLifetimeScope("myscope"))
{
    var service0 = myscope.Resolve<MyServiceV2>();
    using (var scope = myscope.BeginLifetimeScope())
    {
        var service1 = myscope.Resolve<MyServiceV2>();
        var service2 = myscope.Resolve<MyServiceV2>();
        Console.WriteLine($"service1==service2?{service1 == service2}");
        Console.WriteLine($"service0==service1?{service0 == service1}");
    }
}

本节到此就要结束了,从下节将开始配置框架的学习。

 

源码可访问

https://github.com/IronMarmot/Samples/tree/master/CoreSamples


相关文章
|
1月前
|
存储 开发框架 JSON
ASP.NET Core OData 9 正式发布
【10月更文挑战第8天】Microsoft 在 2024 年 8 月 30 日宣布推出 ASP.NET Core OData 9,此版本与 .NET 8 的 OData 库保持一致,改进了数据编码以符合 OData 规范,并放弃了对旧版 .NET Framework 的支持,仅支持 .NET 8 及更高版本。新版本引入了更快的 JSON 编写器 `System.Text.UTF8JsonWriter`,优化了内存使用和序列化速度。
|
2月前
|
开发框架 监控 前端开发
在 ASP.NET Core Web API 中使用操作筛选器统一处理通用操作
【9月更文挑战第27天】操作筛选器是ASP.NET Core MVC和Web API中的一种过滤器,可在操作方法执行前后运行代码,适用于日志记录、性能监控和验证等场景。通过实现`IActionFilter`接口的`OnActionExecuting`和`OnActionExecuted`方法,可以统一处理日志、验证及异常。创建并注册自定义筛选器类,能提升代码的可维护性和复用性。
|
2月前
|
开发框架 .NET 中间件
ASP.NET Core Web 开发浅谈
本文介绍ASP.NET Core,一个轻量级、开源的跨平台框架,专为构建高性能Web应用设计。通过简单步骤,你将学会创建首个Web应用。文章还深入探讨了路由配置、依赖注入及安全性配置等常见问题,并提供了实用示例代码以助于理解与避免错误,帮助开发者更好地掌握ASP.NET Core的核心概念。
100 3
|
1月前
|
开发框架 JavaScript 前端开发
一个适用于 ASP.NET Core 的轻量级插件框架
一个适用于 ASP.NET Core 的轻量级插件框架
|
2月前
|
开发框架 NoSQL .NET
利用分布式锁在ASP.NET Core中实现防抖
【9月更文挑战第5天】在 ASP.NET Core 中,可通过分布式锁实现防抖功能,仅处理连续相同请求中的首个请求,其余请求返回 204 No Content,直至锁释放。具体步骤包括:安装分布式锁库如 `StackExchange.Redis`;创建分布式锁服务接口及其实现;构建防抖中间件;并在 `Startup.cs` 中注册相关服务和中间件。这一机制有效避免了短时间内重复操作的问题。
|
3月前
|
开发框架 监控 .NET
开发者的革新利器:ASP.NET Core实战指南,构建未来Web应用的高效之道
【8月更文挑战第28天】本文探讨了如何利用ASP.NET Core构建高效、可扩展的Web应用。ASP.NET Core是一个开源、跨平台的框架,具有依赖注入、配置管理等特性。文章详细介绍了项目结构规划、依赖注入配置、中间件使用及性能优化方法,并讨论了安全性、可扩展性以及容器化的重要性。通过这些技术要点,开发者能够快速构建出符合现代Web应用需求的应用程序。
58 0
|
3月前
|
缓存 数据库连接 API
Entity Framework Core——.NET 领域的 ORM 利器,深度剖析其最佳实践之路
【8月更文挑战第28天】在软件开发领域,高效的数据访问与管理至关重要。Entity Framework Core(EF Core)作为一款强大的对象关系映射(ORM)工具,在 .NET 开发中扮演着重要角色。本文通过在线书店应用案例,展示了 EF Core 的核心特性和优势。我们定义了 `Book` 实体类及其属性,并通过 `BookStoreContext` 数据库上下文配置了数据库连接。EF Core 提供了简洁的 API,支持数据的查询、插入、更新和删除操作。
116 0
|
开发框架 前端开发 .NET
ASP.NET Core 核心特性学习笔记「下」
ASP.NET Core 核心特性学习笔记「下」
|
开发框架 前端开发 中间件
ASP.NET Core 核心特性学习笔记「上」
ASP.NET Core 核心特性学习笔记「上」
|
SQL 机器学习/深度学习 Cloud Native
.NET 云原生架构师训练营(模块二 基础巩固 EF Core 更新和迁移)--学习笔记
- 状态 - 自动变更检测 - 不查询删除和更新 - 并发
252 0
.NET 云原生架构师训练营(模块二 基础巩固 EF Core 更新和迁移)--学习笔记
下一篇
无影云桌面