日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

一起聊聊Microsoft.Extensions.DependencyInjection

發布時間:2023/12/4 编程问答 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 一起聊聊Microsoft.Extensions.DependencyInjection 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Microsoft.Extensions.DependencyInjection在github上同樣是開源的,它在dotnetcore里被廣泛的使用,比起之前的autofac,unity來說,它可以說是個包裹,或者叫適配器,它自己提供了默認的DI實現,同時也支持第三方的IOC容器,在這段時間里使用了它,就想,這東西為什么被在dotnetcore里大放異彩?為什么會全程使用它?從程序的開始到程序啟動起來,你可以發現它無處不在,在框架里是這樣,在業務層同時也是這樣。

聊聊Microsoft.Extensions.DependencyInjection知識點包括

  • 它的開源地址

  • IServiceCollection和IApplicationBuilder

  • 自定義模塊用它

  • 在Startup.ConfigureServices中注冊自定義模塊

  • 在Startup.Configure中使用它,進行默認模塊的初始化

  • 在任意對象的構造方法中使用它

  • 一步一步的揭秘

    一 它的開源地址

    https://github.com/aspnet/DependencyInjection

    可以看看它的README.md,就知道它是個大包裹,類似于大叔LindAgile里的Container,完全可以擴展支持其它第三方的IOC容器,這就像大叔經常說的那句話一樣,在IT江湖中,英雄總是所風略同……

    二 dotnetcore整個框架在用它

    在你的dotnetcore應用程序里,你會發現在Startup類中有很多像services.AddMvc()這樣的方法,這實質是像應用程序中注冊一個組件,這里的MVC是一個統一的組件,它不依賴于windows,不依賴于dotnet,整個dotnetcore里把很多組件都解耦了,這樣在維護和nuget包升級時都更靈活,自己有問題就優化自己,而不影響其它模塊。(越說越像微服務的宗旨)。

    IServiceCollection主要用來注冊服務,就是某個接口和某種實現的對應關系,這種注冊是我們在Startup.ConfigureServices方法里完成的,如下面的AddLind()這個方法,它完成了對Lind模塊的注冊,在方法內部可以注冊本模塊的其它服務。


    ? ? ? ?/// <summary>/// 添加Lind框架和它們依賴子模塊 ? ?
    ? ?? ?
    /// </summary>/// <param name="services"></param>/// <param name="setupAction"></param>/// <returns></returns>public static LindBuilder AddLind( ? ? ?
    ? ? ?
    this IServiceCollection services,Action<LindOptions> setupAction){ ? ? ? ? ?
    ??
    if (setupAction == null) throw new ArgumentNullException(nameof(setupAction));services.Configure(setupAction); ? ? ?
    ?? ? ?
    var options = new LindOptions(); ? ? ? ? ?
    ??
    //注冊框架所依賴的基礎模塊 ? ? ? ? ? ?//options.Extensions.Add(); ? ? ? ? ?
    ?
    //注冊外部模塊 ? ? ? ? ?
    ? ? ? ? ? ?setupAction(options); ? ? ? ?
    ? ? ? ? ? ??
    foreach (var serviceExtension in options.Extensions)serviceExtension.AddServices(services);services.AddSingleton(options); ? ?
    ? ? ? ?
    return new LindBuilder(services);}

    IApplicationBuilder是指對應該程序的啟動,或者理解為初始化,當上面的服務注冊完成后就執行它了,我們一般在Startup.Configure去激活它,它的目的比較單純,就是對模塊進行初始化,如果沒什么特殊的功能,這個代碼可以是空的,下面Builder中初始化了日志組件。


    /// <summary>/// 在應用程序中開啟-Lind框架 ? ? ?
    ? ? ? ?
    /// </summary>/// <param name="app">The <see cref="IApplicationBuilder" /> instance this method extends.</param>/// <returns>The <see cref="IApplicationBuilder" /> instance this method extends.</returns>public static IApplicationBuilder UseLind(this IApplicationBuilder app){ ? ? ? ? ?
    ??
    if (app == null) ? ? ? ? ?
    ? ? ?
    throw new ArgumentNullException(nameof(app)); ? ? ? ? ? ?var provider = app.ApplicationServices; ?
    ? ? ? ? ?
    //注冊Lind框架所需要的底層服務LoggerFactory.SetLogger((ILogger)provider.GetService(typeof(ILogger))); ? ? ? ? ? ?return app;}

    三 自定義模塊用它

    如果希望定義自己的功能模塊實現與dotnetcore框架的結合可以自定義Options和OptionsExtensions,前者主要實現的是服務列表的注冊,而后臺主要是對現有模塊提供注冊的入口,下面的代碼主要實現了一個EF倉儲模塊的注冊過程。

    模塊所需的模型

    public class RepositoryOptions{ ? ? ? ?public string ConnString { get; set; }}

    注冊服務列表


    /// <summary>/// 注冊有關-EF倉儲的服務列表 ?
    ? ?
    /// </summary>public class EFOptionsExtension : ILindOptionsExtension{ ? ? ?
    ? ? ??
    private readonly Action<RepositoryOptions> _configure; ? ? ? ? ?public EFOptionsExtension(Action<RepositoryOptions> configure){_configure = configure;} ? ? ?

    ?
    public void AddServices(IServiceCollection services){services.AddSingleton(typeof(IRepository), typeof(EFRepository)); ? ? ? ?
    ? ?
    var mysqlOptions = new RepositoryOptions();_configure(mysqlOptions);}}

    在外部使用這個模塊,就是在Startup中注冊它

    public static class RepositoryOptionsExtensions{ ? ? ?
    ? ? ??
    public static LindOptions UseEF(this LindOptions options, Action<RepositoryOptions> configure){options.RegisterExtension(new EFOptionsExtension(configure)); ? ? ?
    ? ? ? ? ?
    return options;}}

    四 在Startup.ConfigureServices中注冊自定義模塊

    上面的代碼主要是自定義一個模塊,而在startup中使用它,就像下面的代碼,十分簡潔,當前有些配置信息可以到在基于環境變量的json文件里!

    public void ConfigureServices(IServiceCollection services){services.AddMvc();services.AddLind(x =>{x.UseEF(o =>{o.ConnString = "localhost:1433";});x.UseDapper(o =>{o.ConnString = "localhost:3306";});});}

    五 在Startup.Configure中使用它,進行默認模塊的初始化

    上面的代碼實現了對模塊下一些服務進行注冊,然后下面代碼主要是進行一些初始化的工作。

    public void Configure(IApplicationBuilder app, IHostingEnvironment env){ ? ? ? ? ? ?if (env.IsDevelopment()){app.UseDeveloperExceptionPage();}app.UseMvc();app.UseLind();}

    六 在任意對象的構造方法中使用它

    當我們把服務注冊后,可以在任意類型的構造方法中使用它,而不是只能在控制器中使用,這一點dotnetcore DI做的確實不錯,給它100個贊!

    這種注冊

    ? ?public class ApiLoggerOptionsExtension : IPilipaOptionsExtension{Action<ApiLoggerConfig> _config; ? ? ?
    ??
    public ApiLoggerOptionsExtension(Action<ApiLoggerConfig> config){_config = config;} ? ?
    ??
    public void AddServices(IServiceCollection services){ApiLoggerConfig apiLoggerConfig = new ApiLoggerConfig();_config(apiLoggerConfig);//裝飾services.AddSingleton(apiLoggerConfig);//注冊對象里的屬性,在對象的構造方法被注入services.AddSingleton(typeof(ILogger), typeof(ApiLogger));//注冊對象,在使用對象的類的構造方法被注入 ? ? ? ?}}

    這種使用

    ? ? ? ?ApiLoggerConfig _config; ?
    ? ? ? ?
    ? ? ? ?
    public ApiLogger(ApiLoggerConfig config){_config = config;}

    對于上面的代碼實現了在OptionsExtension里進行注冊,然后在任意類型中使用它,感覺這點確實靈活了不少!

    今天咱們對dotnetcore DependencyInjection的分享就到這里,希望大家也盡量把模塊從項目中解放出來


    原文地址:?http://www.cnblogs.com/lori/p/7651787.html


    .NET社區新聞,深度好文,微信中搜索dotNET跨平臺或掃描二維碼關注

    總結

    以上是生活随笔為你收集整理的一起聊聊Microsoft.Extensions.DependencyInjection的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。