DotNetCore跨平臺~元件化時代來了
阿新 • • 發佈:2018-12-29
進行dotnetcore之後,各種物件都是基於DI進行生產的,這就有了物件的生命週期一說,早在autofac裡也有相關知識點,這與Microsoft.Extensions.DependencyInjection是完全溫和的,方便大家理解,在講今天的元件化之前,先對DI的三種生命週期進行理解一下:
AddSingleton:單例,程序內它是唯一的
AddTransient:瞬息,在物件在當前環境內,作用域內是唯一的
AddScoped:請求,物件在一個HTTP請求內是唯一的
下面來看今天的元件化的實現,比如我希望對nosql進行封裝,在以後使用它時,直接在程式碼startup中進行註冊,或者使用配置檔案進行註冊,我們就可以涉及這樣一個擴充套件方法來實現對IServiceCollection擴充套件!
/// <summary> /// nosql服務擴充套件 /// </summary> public static class NoSqlExtensions { /// <summary> /// 使用Redis /// </summary> /// <param name="services"></param> /// <param name="options"></param> /// <returns></returns>public static IServiceCollection UseRedis( this IServiceCollection services, Action<RedisConfig> options = null) { RedisConfig option = new RedisConfig(); options?.Invoke(option); ObjectMapper.MapperTo<RedisConfig>(option, ConfigFileHelper.Get<RedisConfig>());//優先順序裝飾器 services.AddSingleton(option); services.AddSingleton<RedisManager, RedisManager>(); return services; } /// <summary> /// 使用Mongodb /// </summary> /// <param name="services"></param> /// <param name="options"></param> /// <returns></returns> public static IServiceCollection UseMongodb( this IServiceCollection services, Action<MongodbConfig> options = null) { MongodbConfig option = new MongodbConfig(); options?.Invoke(option); ObjectMapper.MapperTo<MongodbConfig>(option, ConfigFileHelper.Get<MongodbConfig>());//優先順序裝飾器 services.AddSingleton(option); services.AddSingleton<MongodbManager, MongodbManager>(); return services; } }
在程式中使用時,也是很方便,注意的是,如果配置檔案中也配置它了,我們將以配置檔案為準,這樣在生產環境裡,你的程式碼注入的引數,不用被註釋和刪除!
#region 服務元件 services.UseRabbitMQ(o => { o.ExchangeName = "AutoCalculate"; o.MqServerHost = "amqp://192.168.200.214:5672"; }); services.UseRedis(o => { o.Host = "192.168.200.214:6379"; o.AuthPassword = "2017"; }); services.UseDapper(o => { o.DbType = 2; o.ConnectionString = "test"; }); #endregion
感謝各位的閱讀!
我們的框架應該是基於元件化的!
我們的系統應該是基於微服務化的!
我們的部署,應該是基於自動化的!