1、前言
很多IoC框架都支持以配置文件的形式实现接口和类的注册,Autofac当然也不例外。本文就来介绍一下如何利用JSON、XML等配置文件来实现接口和类的注册。
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使用XML、JSON等配置文件实现接口和类注册的方法。在官方文档里还有很多其他的配置节点参数,有兴趣的同志可以自行深入了解。



















