.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




相关文章
|
20天前
|
开发框架 .NET 开发者
简化 ASP.NET Core 依赖注入(DI)注册-Scrutor
Scrutor 是一个简化 ASP.NET Core 应用程序中依赖注入(DI)注册过程的开源库,支持自动扫描和注册服务。通过简单的配置,开发者可以轻松地从指定程序集中筛选、注册服务,并设置其生命周期,同时支持服务装饰等高级功能。适用于大型项目,提高代码的可维护性和简洁性。仓库地址:&lt;https://github.com/khellang/Scrutor&gt;
39 5
|
3月前
|
存储 开发框架 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月前
|
开发框架 .NET 程序员
驾驭Autofac,ASP.NET WebApi实现依赖注入详细步骤总结
Autofac 是一个轻量级的依赖注入框架,专门为 .NET 应用程序量身定做,它就像是你代码中的 "魔法师",用它来管理对象的生命周期,让你的代码更加模块化、易于测试和维护
驾驭Autofac,ASP.NET WebApi实现依赖注入详细步骤总结
|
2月前
|
开发框架 .NET C#
在 ASP.NET Core 中创建 gRPC 客户端和服务器
本文介绍了如何使用 gRPC 框架搭建一个简单的“Hello World”示例。首先创建了一个名为 GrpcDemo 的解决方案,其中包含一个 gRPC 服务端项目 GrpcServer 和一个客户端项目 GrpcClient。服务端通过定义 `greeter.proto` 文件中的服务和消息类型,实现了一个简单的问候服务 `GreeterService`。客户端则通过 gRPC 客户端库连接到服务端并调用其 `SayHello` 方法,展示了 gRPC 在 C# 中的基本使用方法。
45 5
在 ASP.NET Core 中创建 gRPC 客户端和服务器
|
28天前
|
开发框架 缓存 .NET
GraphQL 与 ASP.NET Core 集成:从入门到精通
本文详细介绍了如何在ASP.NET Core中集成GraphQL,包括安装必要的NuGet包、创建GraphQL Schema、配置GraphQL服务等步骤。同时,文章还探讨了常见问题及其解决方法,如处理复杂查询、错误处理、性能优化和实现认证授权等,旨在帮助开发者构建灵活且高效的API。
27 3
|
5天前
|
开发框架 算法 中间件
ASP.NET Core 中的速率限制中间件
在ASP.NET Core中,速率限制中间件用于控制客户端请求速率,防止服务器过载并提高安全性。通过`AddRateLimiter`注册服务,并配置不同策略如固定窗口、滑动窗口、令牌桶和并发限制。这些策略可在全局、控制器或动作级别应用,支持自定义响应处理。使用中间件`UseRateLimiter`启用限流功能,并可通过属性禁用特定控制器或动作的限流。这有助于有效保护API免受滥用和过载。 欢迎关注我的公众号:Net分享 (239字符)
24 0
|
4月前
|
开发框架 监控 前端开发
在 ASP.NET Core Web API 中使用操作筛选器统一处理通用操作
【9月更文挑战第27天】操作筛选器是ASP.NET Core MVC和Web API中的一种过滤器,可在操作方法执行前后运行代码,适用于日志记录、性能监控和验证等场景。通过实现`IActionFilter`接口的`OnActionExecuting`和`OnActionExecuted`方法,可以统一处理日志、验证及异常。创建并注册自定义筛选器类,能提升代码的可维护性和复用性。
|
4月前
|
开发框架 .NET 中间件
ASP.NET Core Web 开发浅谈
本文介绍ASP.NET Core,一个轻量级、开源的跨平台框架,专为构建高性能Web应用设计。通过简单步骤,你将学会创建首个Web应用。文章还深入探讨了路由配置、依赖注入及安全性配置等常见问题,并提供了实用示例代码以助于理解与避免错误,帮助开发者更好地掌握ASP.NET Core的核心概念。
115 3
|
3月前
|
开发框架 JavaScript 前端开发
一个适用于 ASP.NET Core 的轻量级插件框架
一个适用于 ASP.NET Core 的轻量级插件框架
|
4月前
|
开发框架 NoSQL .NET
利用分布式锁在ASP.NET Core中实现防抖
【9月更文挑战第5天】在 ASP.NET Core 中,可通过分布式锁实现防抖功能,仅处理连续相同请求中的首个请求,其余请求返回 204 No Content,直至锁释放。具体步骤包括:安装分布式锁库如 `StackExchange.Redis`;创建分布式锁服务接口及其实现;构建防抖中间件;并在 `Startup.cs` 中注册相关服务和中间件。这一机制有效避免了短时间内重复操作的问题。

热门文章

最新文章