ASP.NET Core 3.1系列(27)——Autofac使用JSON、XML配置文件

news2024/11/20 20:23:14

1、前言

很多IoC框架都支持以配置文件的形式实现接口和类的注册,Autofac当然也不例外。本文就来介绍一下如何利用JSONXML等配置文件来实现接口和类的注册。

2、定义接口和类

这里搭建了一个简单的分层项目,如下图所示:

在这里插入图片描述
Repository层代码如下所示:

namespace App.Repository.Contract
{
    public interface ICatRepository
    {
        string GetCatMsg();
    }
}
namespace App.Repository.Contract
{
    public interface IDogRepository
    {
        string GetDogMsg();
    }
}
using App.Repository.Contract;

namespace App.Repository
{
    public class CatRepository : ICatRepository
    {
        public string GetCatMsg()
        {
            return "This is cat";
        }
    }
}
using App.Repository.Contract;

namespace App.Repository
{
    public class DogRepository : IDogRepository
    {
        public string GetDogMsg()
        {
            return "This is dog";
        }
    }
}

Service层代码如下所示:

namespace App.Service.Contract
{
    public interface ICatService
    {
        string Get();
    }
}
namespace App.Service.Contract
{
    public interface IDogService
    {
        string Get();
    }
}
using App.Repository.Contract;
using App.Service.Contract;

namespace App.Service
{
    public class CatService : ICatService
    {
        protected readonly ICatRepository _repository;

        public CatService(ICatRepository repository)
        {
            _repository = repository;
        }

        public string Get()
        {
            return _repository.GetCatMsg();
        }
    }
}
using App.Repository.Contract;
using App.Service.Contract;

namespace App.Service
{
    public class DogService : IDogService
    {
        protected readonly IDogRepository _repository;

        public DogService(IDogRepository repository)
        {
            _repository = repository;
        }

        public string Get()
        {
            return _repository.GetDogMsg();
        }
    }
}

3、基于XML配置文件的注册

3.1、创建XML配置文件

使用NuGet引入如下组件:

Autofac
Autofac.Configuration
Microsoft.Extensions.Configuration
Microsoft.Extensions.Configuration.Xml

在这里插入图片描述
添加一个XML文件,名称为autofac.xml,设置为始终复制,如下图所示

在这里插入图片描述
autofac.xml的代码如下:

<?xml version="1.0" encoding="utf-8" ?>
<autofac>
	<components name="0">
		<type>App.Repository.CatRepository, App.Repository</type>
		<services name="0" type="App.Repository.Contract.ICatRepository, App.Repository.Contract" />
		<instanceScope>perlifetimescope</instanceScope>
		<injectProperties>false</injectProperties>
	</components>
	<components name="1">
		<type>App.Repository.DogRepository, App.Repository</type>
		<services name="0" type="App.Repository.Contract.IDogRepository, App.Repository.Contract" />
		<instanceScope>perlifetimescope</instanceScope>
		<injectProperties>false</injectProperties>
	</components>
	<components name="2">
		<type>App.Service.CatService, App.Service</type>
		<services name="0" type="App.Service.Contract.ICatService, App.Service.Contract" />
		<instanceScope>perlifetimescope</instanceScope>
		<injectProperties>false</injectProperties>
	</components>
	<components name="3">
		<type>App.Service.DogService, App.Service</type>
		<services name="0" type="App.Service.Contract.IDogService, App.Service.Contract" />
		<instanceScope>perlifetimescope</instanceScope>
		<injectProperties>false</injectProperties>
	</components>
</autofac>

3.2、配置节点的说明

下面简单说明一下各个节点的意义:

3.2.1、type节点

<type>App.Repository.CatRepository, App.Repository</type>

这里的App.Repository.CatRepository表示类的全名,App.Repository表示类所在的程序集名称。type节点主要用来设置你要注册的类。

3.2.2、services节点

<services name="0" type="App.Repository.Contract.ICatRepository, App.Repository.Contract" />

这里的App.Repository.Contract.ICatRepository表示接口全名,App.Repository.Contract表示接口所在的程序集名称。该节点指的是注册的类将要转换为哪个接口。

3.2.3、instanceScope节点

<instanceScope>perlifetimescope</instanceScope>

instanceScope节点可以设置实例的生命周期,可以取的值如下所示:

  • singleinstance
  • perlifetimescope
  • perdependency
  • perrequest

3.2.4、injectProperties节点

<injectProperties>false</injectProperties>

injectProperties节点表示是否进行属性注入。由于例子中使用的是构造注入,因此设置为false即可。

3.3、Autofac加载XML配置文件

现在XML配置文件已经定义好了,剩下的工作就是去加载它了,代码如下:

using App.Service.Contract;
using Autofac;
using Autofac.Configuration;
using Microsoft.Extensions.Configuration;
using System;

namespace Ap
{
    internal class Program
    {
        static void Main(string[] args)
        {
            // 加载配置文件
            ConfigurationBuilder config = new ConfigurationBuilder();
            config.AddXmlFile("autofac.xml");

            // 注册配置模块
            ConfigurationModule module = new ConfigurationModule(config.Build());
            ContainerBuilder builder = new ContainerBuilder();
            builder.RegisterModule(module);

            // 创建容器
            IContainer container = builder.Build();

            // ICatService
            ICatService cat = container.Resolve<ICatService>();
            Console.WriteLine(cat.Get());

            // IDogService
            IDogService dog = container.Resolve<IDogService>();
            Console.WriteLine(dog.Get());
        }
    }
}

运行结果如下所示:

This is cat
This is dog

4、基于JSON配置文件的注册

如果你觉得XML文件太过臃肿,那可以考虑使用轻量级的JSON文件。与XML相比,JSON里的节点名称和含义其实没有太大变化。使用NuGet引入如下组件:

Autofac
Autofac.Configuration
Microsoft.Extensions.Configuration
Microsoft.Extensions.Configuration.Json

在这里插入图片描述
添加一个JSON文件,名称为autofac.json,设置为始终复制,如下图所示:

在这里插入图片描述
autofac.json代码如下:

{
    "components": [
        {
            "type": "App.Repository.CatRepository, App.Repository",
            "services": [
                {
                    "type": "App.Repository.Contract.ICatRepository, App.Repository.Contract"
                }
            ],
            "injectProperties": false,
            "instanceScope": "perlifetimescope"
        },
        {
            "type": "App.Repository.DogRepository, App.Repository",
            "services": [
                {
                    "type": "App.Repository.Contract.IDogRepository, App.Repository.Contract"
                }
            ],
            "injectProperties": false,
            "instanceScope": "perlifetimescope"
        },
        {
            "type": "App.Service.CatService, App.Service",
            "services": [
                {
                    "type": "App.Service.Contract.ICatService, App.Service.Contract"
                }
            ],
            "injectProperties": false,
            "instanceScope": "perlifetimescope"
        },
        {
            "type": "App.Service.DogService, App.Service",
            "services": [
                {
                    "type": "App.Service.Contract.IDogService, App.Service.Contract"
                }
            ],
            "injectProperties": false,
            "instanceScope": "perlifetimescope"
        }
    ]
}

定义好JSON文件后,只需要加载配置文件即可,代码如下:

using App.Service.Contract;
using Autofac;
using Autofac.Configuration;
using Microsoft.Extensions.Configuration;
using System;

namespace Ap
{
    internal class Program
    {
        static void Main(string[] args)
        {
            // 加载配置文件
            ConfigurationBuilder config = new ConfigurationBuilder();
            config.AddJsonFile("autofac.json");

            // 注册
            ConfigurationModule module = new ConfigurationModule(config.Build());
            ContainerBuilder builder = new ContainerBuilder();
            builder.RegisterModule(module);

            // 创建容器
            IContainer container = builder.Build();

            // ICatService
            ICatService cat = container.Resolve<ICatService>();
            Console.WriteLine(cat.Get());

            // IDogService
            IDogService dog = container.Resolve<IDogService>();
            Console.WriteLine(dog.Get());
        }
    }
}

运行结果如下所示:

This is cat
This is dog

5、结语

本文简单介绍了Autofac使用XMLJSON等配置文件实现接口和类注册的方法。在官方文档里还有很多其他的配置节点参数,有兴趣的同志可以自行深入了解。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/162864.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Verilog HDL

一、基础语法 1. 基础知识 &#xff08;1&#xff09;逻辑值 逻辑0&#xff1a;低电平。 逻辑1&#xff1a;高电平。 逻辑X&#xff1a;未知&#xff0c;可能是高电平&#xff0c;也可能是低电平。 逻辑Z&#xff1a;高阻态&#xff0c;外部没有激励信号&#xff0c;是一…

读书笔记《深度学习与图像识别原理与实践 大白话讲解对小白易懂》2022-8-5

开始 目录前言1. 常见深度学习框架2. 图像分类算法2.1 传统类2.2 机器学习2.2.1 人工神经网络&#xff08;神经元&#xff09;2.2.2 卷积神经网络3. 目标检测算法3.1 分类定位&#xff08;单目标&#xff09;3.2 分类定位&#xff08;多目标&#xff0c;目标检测&#xff09;3.…

近端串扰NEXT和远端串扰的ADS仿真

目录 近端串扰NEXT和远端串扰FEXT 串扰仿真原理图 NEXT特征 减少NEXT的措施 FEXT特征 减少FEXT的措施 本文记录近阶段对近端串扰和远端串扰概念的理解。 经验法则&#xff1a;最大可容许串扰大约是信号摆幅的5%。 近端串扰NEXT和远端串扰FEXT 静态线上的靠近驱动源的一端…

CTF中常用的http知识点总结

目录 前提知识 请求头大全 响应头大全 请求方法大全 常见考点 从某ip访问 从某网站跳转 身份为admin才可以访问 从某某浏览器访问 靶场练习 [极客大挑战 2019]Http Become A Member 前提知识 请求头大全 Header解释示例Accept指定客户端可以接收的内容类型Accep…

逆向分析资料汇总

商务合作 2023年招聘 ​安全业务和软件业务(商务合作) 移动端漏洞或隐私合规检测 APP常见漏洞扫描器 ​移动端APP隐私合规检测 2023年逆向分析资料汇总 移动端漏洞/安全检测与隐私合规解决方案 Frida逆向分析基础 APP基于Frida脱壳 frida hook so导出或未导出函数的方法…

【写作能力提升】写作小白需要避免的五个写作误区和灵魂五问

“ 【写作能力提升】系列文章&#xff1a; 为什么建议你一定要学会写作? 手把手教你快速搞定4个职场写作场景 5种搭建⽂章架构的⽅法”免费赠送! ”一、前言 Hello&#xff0c;我是小木箱&#xff0c;今天主要分享的内容是: 写作小白需要避免的五个写作误区和灵魂五问。 二、 …

E. The Human Equation(前缀和与差分数组)

嘤&#xff0c;总算过了 题目大意&#xff1a;可以从一个序列中按照顺序&#xff08;可间断&#xff09;选出一堆数&#xff0c;选出的这些数可以做以下操作&#xff1a; 奇数位置&#xff0b;1&#xff0b;1&#xff0b;1&#xff0c;偶数位置−1- 1−1偶数位置&#xff0b;1…

微信小程序项目实例——食堂吃哪个

微信小程序项目实例——食堂吃哪个 文章目录微信小程序项目实例——食堂吃哪个一、项目展示二、操作流程和核心代码三、效果展示文末项目代码见文字底部&#xff0c;点赞关注有惊喜 一、项目展示 这是一款娱乐性的小程序 目的是为了解决大学生吃饭的选择困难症 用户可以选择不…

51单片机的特殊功能寄存器(SFR)

阅读前提醒&#xff1a; 文中提到的8051指的是8051微控制器&#xff0c;即51单片机 在上一篇文章51单片机的存储结构中&#xff0c;提到8051微控制器的RAM被划分为通用寄存器、按位寻址寄存器、寄存器组、以及特殊功能寄存器。 这里讲一下特殊功能寄存器&#xff08;SFR&…

五金制造业ERP如何解决企业销售管理难题?

销售管理是五金制造企业管理中非常重要的一个环节&#xff0c;它决定着企业发展的提速和效益的提升。那么企业要如何才能做好销售管理呢&#xff1f;在这里五金制造业ERP系统就起到了重要作用。五金制造业常见的销售管理难题及解决方法&#xff1a;销售插单改单严重&#xff0c…

在不同环境下 Docker 的安装部署

本篇内容主要介绍了&#xff1a;Docker&#xff1a;不同环境下的安装部署&#xff0c;包括&#xff0c;Docker 在 Centos7 下的安装、Docker 在 MacOS 下的安装、Docker 在 Windows 下的安装、以及 Docker 服务相关基础命令&#xff01; 文章目录一、Docker 在 Centos7 下的安装…

使用Redhat OpenStack发放云主机

云管理员操作创建项目登录到OpenStack主界面&#xff0c;使用admin账户登录&#xff0c;创建项目虚拟内核&#xff1a;表明此项目可以使用的vCPU的数量实例&#xff1a;表明该项目最多可以运行的虚拟机数量注入的文件&#xff1a;表明最多可以向此数据中心存多少文件已注入文件…

react基础Day03-生命周期render props模式高阶组件原理揭秘

组件生命周期&#xff08;★★★&#xff09; 目标 说出组件生命周期对应的钩子函数钩子函数调用的时机 概述 意义&#xff1a;组件的生命周期有助于理解组件的运行方式&#xff0c;完成更复杂的组件功能、分析组件错误原因等 组件的生命周期&#xff1a; 组件从被创建到挂…

JVM学习(二):JVM监控及诊断工具-命令行篇

一、概述性能诊断是软件工程师在日常工作中需要经常面对和解决的问题&#xff0c;在用户体验至上的今天&#xff0c;解决好应用的性能问题能带来非常大的收益。Java 作为最流行的编程语言之一&#xff0c;其应用性能诊断一直受到业界广泛关注。可能造成Java应用出现性能问题的因…

十二.自定义类型:结构体、联合、枚举

目录 一.结构体 1.结构体类型的基础知识 &#xff08;1&#xff09;结构的声明 &#xff08;2&#xff09;匿名结构体 &#xff08;3&#xff09;结构体变量的定义和初始化 &#xff08;4&#xff09;结构的自引用 &#xff08;5&#xff09;结构体传参 2.结构体内存对齐…

227. 基本计算器 II

227. 基本计算器 II题目算法设计&#xff1a;栈扩展&#xff1a;后缀表达式题目 传送门&#xff1a;https://leetcode.cn/problems/basic-calculator-ii/submissions/ 算法设计&#xff1a;栈 一个功能完备的计算器功能&#xff0c;有很多功能&#xff0c;我们需要从最简单的…

【CAD .NET】第一课 开发自己的CAD软件

开发自己的CAD软件(解析库私信我buy) 介绍 CAD .NET 为在 .NET 环境下开发解决方案的库。它支持 AutoCAD DWG、DXF、PLT 和其他 CAD 格式。它支持 AutoCAD DWG, DXF, PLT 和其他 CAD 格式。 该库可用于广泛领域: 处理所有项目阶段的工业图纸 监测和远程控制程序 数控(C…

ReactNative0.71正式版发布,Ts作为首要开发语言

时隔近4个月的时间&#xff0c;ReactNative带来了0.71版本的更新&#xff0c;这速度对比隔壁Flutter不得不说是真的有的慢。 这个版本的更新的内容还是比较重磅和突破性的&#xff0c;主要体现在如下几点&#xff1a; 编程语法默认改为TypeScript使用Flexbox Gap使布局更加简…

AlmaLinux 9部署JumpServer

JumpServer简介 JumpServer 是广受欢迎的开源堡垒机&#xff0c;是符合 4A 规范的专业运维安全审计系统。 JumpServer 使用 Python 开发&#xff0c;配备了业界领先的 Web Terminal 方案&#xff0c;交互界面美观、用户体验好。 JumpServer 采纳分布式架构&#xff0c;支持多…

【C++11】—— 类的新功能

目录 一、移动构造和移动赋值的特点 二、类成员变量初始化 三、强制生成默认函数的关键字default 四、禁止生成默认函数的关键字delete 五、继承和多态中的fifinal与override关键字 一、移动构造和移动赋值的特点 默认成员函数 原来C类中&#xff0c;有6个默认成员函数&a…