在之前的多篇文章中,.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还是其它,使用配置文件配置是最佳实践。