.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. 1.注入拦截器
  2. 2.通过InterceptedBy来定义允许的类型
  3. 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($"service1==service2?{service0 == service1}");
    }
}


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


详细代码请参阅


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




相关文章
|
2月前
|
存储 开发框架 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`,优化了内存使用和序列化速度。
|
13天前
|
开发框架 .NET 程序员
驾驭Autofac,ASP.NET WebApi实现依赖注入详细步骤总结
Autofac 是一个轻量级的依赖注入框架,专门为 .NET 应用程序量身定做,它就像是你代码中的 "魔法师",用它来管理对象的生命周期,让你的代码更加模块化、易于测试和维护
驾驭Autofac,ASP.NET WebApi实现依赖注入详细步骤总结
|
3月前
|
开发框架 监控 前端开发
在 ASP.NET Core Web API 中使用操作筛选器统一处理通用操作
【9月更文挑战第27天】操作筛选器是ASP.NET Core MVC和Web API中的一种过滤器,可在操作方法执行前后运行代码,适用于日志记录、性能监控和验证等场景。通过实现`IActionFilter`接口的`OnActionExecuting`和`OnActionExecuted`方法,可以统一处理日志、验证及异常。创建并注册自定义筛选器类,能提升代码的可维护性和复用性。
|
3月前
|
开发框架 .NET 中间件
ASP.NET Core Web 开发浅谈
本文介绍ASP.NET Core,一个轻量级、开源的跨平台框架,专为构建高性能Web应用设计。通过简单步骤,你将学会创建首个Web应用。文章还深入探讨了路由配置、依赖注入及安全性配置等常见问题,并提供了实用示例代码以助于理解与避免错误,帮助开发者更好地掌握ASP.NET Core的核心概念。
109 3
|
2月前
|
开发框架 JavaScript 前端开发
一个适用于 ASP.NET Core 的轻量级插件框架
一个适用于 ASP.NET Core 的轻量级插件框架
|
3月前
|
开发框架 NoSQL .NET
利用分布式锁在ASP.NET Core中实现防抖
【9月更文挑战第5天】在 ASP.NET Core 中,可通过分布式锁实现防抖功能,仅处理连续相同请求中的首个请求,其余请求返回 204 No Content,直至锁释放。具体步骤包括:安装分布式锁库如 `StackExchange.Redis`;创建分布式锁服务接口及其实现;构建防抖中间件;并在 `Startup.cs` 中注册相关服务和中间件。这一机制有效避免了短时间内重复操作的问题。
|
4月前
|
开发框架 监控 .NET
开发者的革新利器:ASP.NET Core实战指南,构建未来Web应用的高效之道
【8月更文挑战第28天】本文探讨了如何利用ASP.NET Core构建高效、可扩展的Web应用。ASP.NET Core是一个开源、跨平台的框架,具有依赖注入、配置管理等特性。文章详细介绍了项目结构规划、依赖注入配置、中间件使用及性能优化方法,并讨论了安全性、可扩展性以及容器化的重要性。通过这些技术要点,开发者能够快速构建出符合现代Web应用需求的应用程序。
64 0
|
4月前
|
缓存 数据库连接 API
Entity Framework Core——.NET 领域的 ORM 利器,深度剖析其最佳实践之路
【8月更文挑战第28天】在软件开发领域,高效的数据访问与管理至关重要。Entity Framework Core(EF Core)作为一款强大的对象关系映射(ORM)工具,在 .NET 开发中扮演着重要角色。本文通过在线书店应用案例,展示了 EF Core 的核心特性和优势。我们定义了 `Book` 实体类及其属性,并通过 `BookStoreContext` 数据库上下文配置了数据库连接。EF Core 提供了简洁的 API,支持数据的查询、插入、更新和删除操作。
126 0
|
3月前
|
开发框架 前端开发 JavaScript
ASP.NET MVC 教程
ASP.NET 是一个使用 HTML、CSS、JavaScript 和服务器脚本创建网页和网站的开发框架。
45 7
|
3月前
|
存储 开发框架 前端开发
ASP.NET MVC 迅速集成 SignalR
ASP.NET MVC 迅速集成 SignalR
72 0