当前位置: 首页 > news >正文

开源博客项目Blog .NET Core源码学习(9:Autofac使用浅析)

  开源博客项目Blog使用Autofac注册并管理组件和服务,Autofac是面向.net 的开源IOC容器,支持通过接口、实例、程序集等方式注册组件和服务,同时支持属性注入、方法注入等注入方式。本文学习并记录Blog项目中Autofac的使用方式。
  整个Blog解决方案主要在App.Hosting和App.Framwork项目中使用Autofac,这里的使用指的是注册Autofac中间件、注册组件和服务等,不包括在控制器类中传递接口实例。

在这里插入图片描述
  App.Hosting项目中主要在Program.cs文件中注册Autofac中间件,如下图所示,并调用App.Framwork项目中的扩展类注册相关组件和服务。
在这里插入图片描述

  在Program.cs文件的下半部分还调用了App.Framwork项目中的函数赋予全局静态类Storage中的Container属性赋予基于Autofac的ILifetimeScope实例对象,以便在需要的地方能通过代码获取Autofac注册的组件。
在这里插入图片描述
  App.Framwork项目主要在5个类中调用Autofac相关的类或函数,主要包括:
  1)AutofacModule类,位于AutofacModule.cs,命名空间为App.Framwork. DependencyInjection ,主要以仓储模式注入组件,该类将解决方案中所有继承自IScopedDependency 、ISingletonDependency、ITransientDependency等接口的类型注册为组件,将继承自IScopedDependency接口的类型注册为每次使用都创建新实例(InstancePerDependency),将继承自ISingletonDependency接口的类型注册为单例模式(SingleInstance),将继承自ITransientDependency接口的类型注册为每次请求创建新实例(InstancePerLifetimeScope),同时该类将所有继承自ControllerBase的类型都注册为属性自动注入(PropertiesAutowired)。

  2)ContainerBuilderExtensions类,位于ContainerBuilderExtensions.cs,命名空间为App. Framwork.DependencyInjection.Extensions,该类主要将解决方案的所有程序集中类型以指定字符串结尾的类型注册为每次请求创建新实例(InstancePerLifetimeScope),在本项目中主要是注册所有以service结尾的类。
  3)AspectCoreInterceptorAutofacExtensions类,位于AspectCoreInterceptorAutofacExtensions.cs,命名空间为App.Framwork.DependencyInjection. Extensions。该类主要基于AspectCore的动态代理接入Autofac,这个没有看的太明白。
  4)Storage类,位于Storage.cs,命名空间为App.Framwork,该类的属性Container类型为ILifetimeScope,在App.Hosting项目的Program.cs中调用app.UseStaticContainer()(该函数定义于App.Framwork项目ApplicationBuilderExtensions类,位于ApplicationBuilderExtensions.cs,命名空间为App.Framwork.DependencyInjection.Extensions)赋予基于Autofac的ILifetimeScope实例对象值。Container属性主要在Storage类的GetService函数中用于返回指定服务的组件。

参考文献:
[1]https://gitee.com/miss_you/Blog
[2]https://autofac.org/
[3]https://github.com/autofac/Autofac
[4]https://blog.csdn.net/Mr_Fei/article/details/129199686

http://www.lryc.cn/news/304297.html

相关文章:

  • Go语言中的TLS加密:深入crypto/tls库的实战指南
  • 网络原理-TCP/IP(7)
  • HarmonyOS4.0系列——08、整合UI常用组件
  • 【Spring Boot 3】【JPA】一对多单向关联
  • 工信部等九部门:打造一批实现制造过程数字孪生的数字化转型标杆工厂
  • 并发编程(2)基础篇-管程
  • OpenAI文生视频大模型Sora概述
  • [linux]进程间通信(IPC)———共享内存(shm)(什么是共享内存,共享内存的原理图,共享内存的接口,使用演示)
  • Go 原子操作有哪些?
  • 爬虫知识--02
  • SCI一区 | Matlab实现GAF-PCNN-MSA格拉姆角场和双通道PCNN融合注意力机制的多特征分类预测
  • Observability:使用 OpenTelemetry 和 Elastic 监控 OpenAI API 和 GPT 模型
  • 靡语IT:Vue精讲(一)
  • vue3 toRefs之后的变量修改方法
  • 【教程】详解相机模型与坐标转换
  • 171基于matlab的随机共振微弱信号检测
  • petalinux_zynq7 驱动DAC以及ADC模块之三:实现C语言API并编译出库被python调用
  • NXP实战笔记(五):S32K3xx基于RTD-SDK在S32DS上配置ADC的硬件触发同步采样与软件采样过程
  • pikachu靶场-CSRF
  • 【结合OpenAI官方文档】解决Chatgpt的API接口请求速率限制
  • C语言实现基础数据结构——栈
  • 船舶制造5G智能工厂数字孪生可视化平台,推进船舶行业数字化转型
  • 【网络编程】okhttp深入理解
  • 大功率厚膜电阻器制造 – 优化性能?
  • ElasticStack安装(windows)
  • gitlab的使用
  • 基于springboot+vue的植物健康系统(前后端分离)
  • Python爬虫实战入门:爬取360模拟翻译(仅实验)
  • 微服务-微服务API网关Spring-clould-gateway实战
  • ECMAScript modules规范示例详解