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