在之前的多篇文章中,.net core我们都是使用默认的DI,但是在实际使用中,对于复杂的情况,我们还是得用回Autofac比如通过配置文件注入,现在.net core默认提供的DI自己需要写些代码去支持,另外对于自动注入也需要额外代码支持,使用Autofac则方便很多。使用Autofac,我们的仓储和服务使用自动注入,并检索继承了IDependency接口的,那么代码简单如下:
var builder = new ContainerBuilder();
builder.Populate(services);
var baseType = typeof(IDependency);
//服务
var assemblyService = Assembly.Load("MyCore.Services");
//仓储
var assemblyRepository = Assembly.Load("MyCore.Repositories");
builder.RegisterAssemblyTypes(assemblyService, assemblyRepository).Where(m => baseType.IsAssignableFrom(m) && m != baseType) .AsImplementedInterfaces().InstancePerLifetimeScope();另外有一部分我们放到autofac.json中去,比如一些数据库连接字符串,Reids配置,缓存选择,日志选择等,那么autofac.json代码如下:
{
"components": [
{
"type": "MyCore.Infrastructure.Cache.DefaultRedisCache,MyCore.Infrastructure",
"services": [
{
"type": "MyCore.Infrastructure.Cache.ICacheService,MyCore.Infrastructure"
}
],
"instanceScope": "single-instance"
},
{
"type": "MyCore.Infrastructure.Logger.NLogger,MyCore.Infrastructure",
"services": [
{
"type": "MyCore.Infrastructure.Logger.ILogger,MyCore.Infrastructure"
}
],
"instanceScope": "single-instance"
},
{
"type": "MyCore.Repositories.Common.MySqlSugarClient,MyCore.Repositories",
"instanceScope": "per-lifetime-scope"
},
{
"type": "MyCore.Domain.Response.Common.SystemConfig,MyCore.Domain",
"autoActivate": true,
"instanceScope": "single-instance",
"properties": {
"RedisConnection": "",
"RedisInstanceName": "52jiagou:dev:",
"ConnectionString": ""
}
}
]
}注入代码:
IConfigurationBuilder config = new ConfigurationBuilder();
config.AddJsonFile("config/autofac.json");
var module = new ConfigurationModule(config.Build());
builder.RegisterModule(module);这里取得一些系统配置信息SystemConfig使用单例。缓存的具体实现使用内存还是redis还是其它,使用配置文件配置是最佳实践。