• AspNetCore项目-Service注入或覆盖


      使用AspNetCore开发的都已经尝到了各种花式注入的甜头,其中最基本的注入方式莫过于IServiceCollection.Add[Scoped/Transient/Singleton]<TService,TImplementation>()了。而对于已经注册的Service,如果有临时更换的需求就会稍显麻烦。

    拿一个事例做说明:比如以前你是使用网易云音乐听周杰伦的歌的,当网易云不再拥有周杰伦音乐授权的时候,你不得不开始使用QQ音乐来听周杰伦的歌,因为现在QQ音乐拥有了版权。这时候你就需要想办法怎么替换音乐播放器了。

      这个问题我们可以抽象一下:

      音乐播放器作为一个接口:IMusicPlayer,该接口拥有一个方法:PlayJayChou,而最初只是网易云音乐(NetEaseCloudMusic)继承并实现了该接口,且在你的正式环境中使用着,例如AddScoped<IMusicPlayer,NetEaseCloudMusic>()。

      此时需要更换为QQ音乐了,按照一般做法是,OK,添加QQMusic,继承并实现IMusicPlayer,然后嗯,将代码替换:AddScoped<IMusicPlayer,QQMusic>(),发布上线;

      试想,如果QQ版权也过了,最后百度音乐拥有了版权,你还想这样改一遍代码,再发布上线吗?

      基于此,我写了一个小小的项目,基于扩展和配置,灵活的切换你的Service。该项目的能力就是在不需要修改主程序代码的情况下,添加扩展并修改配置,完成Service的切换。

      干货:

      先来个项目一览吧,只看src其实可以得知,项目代码量真的很小,我估计不超过250行:

      配置:在appsettings.json中配置如下内容,属性意义截图中已经给出注释,数组形式。

      上图配置的映射类:

      

     

      主要的实现思路是,读取配置(IMusicPlayer、QQMusic、QQMusic所在程序集的相对路径),利用反射技术分别获取Service的接口和实现类型。

      获取到serviceType和ImplementationType,离注入还会远吗?

     

      如此,项目便已实现。

      使用示例,Startup类的ConfigureServices方法中添加services.AddServiceRegister(),需要放在各类service的注册代码段落之后:

      仓库地址:https://github.com/Med1tator/Medit.AspNetCore.ServiceRegister 

      该项目中已包含MusicPlayer的Sample。

  • 相关阅读:
    03_HibernateSessionFactory源码分析
    02_ThreadLocal语法与源码分析
    01_Java 软、弱引用语法介绍
    Xpath定位和CssSelector定位的区别
    Mac 上自动化构建 jenkins 操作步骤(中)git环境搭建
    Mac 上自动化构建 jenkins 操作步骤(上)
    UI自动化常用的几种等待方法
    Selenium-webdriver 之元素定位方法归类
    统一初始化(Uniform Initialization)
    Mac下electron编译
  • 原文地址:https://www.cnblogs.com/Med1tator/p/10322737.html
Copyright © 2020-2023  润新知