DotNetCore跨平臺~組件化時代來(lai)了
進行dotnetcore之后,各種(zhong)對象都是基于DI進行生(sheng)產的,這(zhe)就有了(le)對象的生(sheng)命周(zhou)期(qi)一(yi)說,早(zao)在autofac里也有相關知(zhi)識點(dian),這(zhe)與Microsoft.Extensions.DependencyInjection是完全溫和的,方便大家(jia)理解(jie),在講今天的組(zu)件化之前,先對DI的三種(zhong)生(sheng)命周(zhou)期(qi)進行理解(jie)一(yi)下:
AddSingleton:單例,進(jin)程內它是唯一的
AddTransient:瞬息,在對象在當前環境內,作用域內是唯一的(de)
AddScoped:請(qing)(qing)求,對象(xiang)在一個HTTP請(qing)(qing)求內是唯一的
下面來看今(jin)天的組件(jian)(jian)化的實現(xian)(xian),比(bi)如(ru)我希望對nosql進(jin)行(xing)封裝,在(zai)以(yi)后使(shi)用它(ta)時(shi),直接在(zai)代(dai)碼startup中進(jin)行(xing)注(zhu)冊,或者使(shi)用配(pei)置文件(jian)(jian)進(jin)行(xing)注(zhu)冊,我們就可以(yi)涉及(ji)這(zhe)樣一個(ge)擴展(zhan)(zhan)方(fang)法來實現(xian)(xian)對IServiceCollection擴展(zhan)(zhan)!
/// <summary> /// nosql服務擴展(zhan) /// </summary> public static class NoSqlExtensions { /// <summary> /// 使用(yong)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>());//優先級裝飾器(qi) services.AddSingleton(option); services.AddSingleton<MongodbManager, MongodbManager>(); return services; } }
在(zai)程(cheng)序中(zhong)使用(yong)(yong)時,也(ye)是很方便,注意的是,如果配(pei)置(zhi)文(wen)件中(zhong)也(ye)配(pei)置(zhi)它了,我(wo)們將以配(pei)置(zhi)文(wen)件為準,這(zhe)樣在(zai)生產環境里,你的代碼注入的參數,不用(yong)(yong)被(bei)注釋和刪除!
#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
感謝各位的閱讀!
我(wo)們的框架(jia)應該是基于(yu)組件(jian)化的!
我們的系統應該是基于(yu)微服務化(hua)的!
我們的部(bu)署,應該(gai)是基于自動化的!