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

32 篇文章 43 订阅

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等配置文件实现接口和类注册的方法。在官方文档里还有很多其他的配置节点参数,有兴趣的同志可以自行深入了解。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值