本文介绍利用 Microsoft.Extensions.Configuration.Binder.dll 来实现超级简单的注入。

1. appsettings.json 中定义配置

假设我们有如下配置:

  1. {
  2. "Logging": {
  3. "LogLevel": {
  4. "Default": "Information",
  5. "Microsoft": "Warning",
  6. "Microsoft.Hosting.Lifetime": "Information"
  7. }
  8. },
  9. "AllowedHosts": "*",
  10. "Tecent": {
  11. "Qzone": {
  12. "Url": "http://i.qq.com",
  13. "CName": "QQ空间",
  14. "Age":
  15. },
  16. "Weixin": {
  17.  
  18. }
  19.  
  20. }
  21. }

2. 定义配置模型类

  1. public interface ITecentConfig
  2. {
  3. QzoneConfig Qzone { get; set; }
  4. }
  1. public class TecentConfig : ITecentConfig
  2. {
  3. public QzoneConfig Qzone { get; set; }
  4. }
  1. public class QzoneConfig
  2. {
  3. public string Url { get; set; }
  4.  
  5. public string CName { get; set; }
  6.  
  7. public int Age { get; set; }
  8. }

3. Nuget 中引用 Microsoft.Extensions.Configuration.Binder.dll

4.  编写 ServiceCollection 的扩展方法

  1. public static class ServiceCollectionExtensions
  2. {
  3. public static void ConfigureApplicationServices(this IServiceCollection services, IConfiguration configuration)
  4. {
  5. ITecentConfig tencentConfig = services.ConfigureStartupConfig<ITecentConfig, TecentConfig>(configuration.GetSection("Tecent"));
  6.  
  7. //由于已经通过依赖注入了,并且单例模式,下面通过依赖注入读取配置。
  8.  
  9. }
  10.  
  11. public static TConfig ConfigureStartupConfig<TConfig>(this IServiceCollection services, IConfiguration configuration)
  12. where TConfig : class, new()
  13. {
  14. if (services == null)
  15. throw new ArgumentNullException(nameof(services));
  16. if (configuration == null)
  17. throw new ArgumentNullException(nameof(configuration));
  18. var config = new TConfig();
  19. configuration.Bind(config);
  20. services.AddSingleton(config);
  21. //.NET Core DI 为我们提供的实例生命周其包括三种:
  22. //Transient: 每一次GetService都会创建一个新的实例
  23. //Scoped: 在同一个Scope内只初始化一个实例 ,可以
  24. // 理解为( 每一个request级别只创建一个实例,同一个http request会在一个 scope内)
  25. //Singleton :整个应用程序生命周期以内只创建一个实例
  26. return config;
  27. }
  28.  
  29. public static IConfig ConfigureStartupConfig<IConfig, ConfigImpl>(this IServiceCollection services, IConfiguration configuration)
  30. where ConfigImpl : class, IConfig, new()
  31. {
  32. if (services == null)
  33. throw new ArgumentNullException(nameof(services));
  34. if (configuration == null)
  35. throw new ArgumentNullException(nameof(configuration));
  36. var config = new ConfigImpl();
  37. configuration.Bind(config);
  38. services.AddSingleton(typeof(IConfig), config);
  39. return config;
  40. }
  41. }

这里需要解释一下,这里有 2 个重载方法  ConfigureStartupConfig, 第一个表示不用接口(或者抽象父类),直接读取配置成我们自己的配置模型,然后依赖注入单例。第二个方法表示只依赖接口或者抽象父类(指:我们自己定义的 ITencentConfig),不依赖具体的子类(指:我们自己定义的 TecentConfig)。

5. 在 Startup.cs 中注册服务

  1. public class Startup
  2. {
  3. public Startup(IConfiguration configuration)
  4. {
  5. Configuration = configuration;
  6. }
  7.  
  8. public IConfiguration Configuration { get; }
  9.  
  10. public void ConfigureServices(IServiceCollection services)
  11. {
  12. services.Configure<CookiePolicyOptions>(options =>
  13. {
  14. options.CheckConsentNeeded = context => true;
  15. });
  16. services.ConfigureApplicationServices(Configuration);//注册我们自定义的服务
  17.  
  18. //注册自定义的模型绑定
  19. services.AddMvc()
  20. .AddNewtonsoftJson();
  21. services.AddRazorPages();
  22. }
  23. }

6.  MVC 控制器中构造函数注入

  1. public class HomeController : Controller
  2. {
  3. private ITecentConfig _tecentConfig;
  4.  
  5. public HomeController(ITecentConfig tecentConfig)
  6. {
  7. _tecentConfig = tecentConfig;
  8. }
  9.  
  10. public IActionResult About()
  11. {
  12. return Content(string.Format("这个是 About 介绍。{0}: {1}。HashCode:{2}",
  13. _tecentConfig.Qzone.CName,
  14. _tecentConfig.Qzone.Url,
  15. _tecentConfig.GetHashCode()
  16. )
  17. );
  18. }
  19. }

7. 效果图

谢谢浏览!

ASP.NET Core 下的依赖注入(一)的更多相关文章

  1. ASP.NET Core中的依赖注入(1):控制反转(IoC)

    ASP.NET Core在启动以及后续针对每个请求的处理过程中的各个环节都需要相应的组件提供相应的服务,为了方便对这些组件进行定制,ASP.NET通过定义接口的方式对它们进行了"标准化&qu ...

  2. ASP.NET Core中的依赖注入(3): 服务的注册与提供

    在采用了依赖注入的应用中,我们总是直接利用DI容器直接获取所需的服务实例,换句话说,DI容器起到了一个服务提供者的角色,它能够根据我们提供的服务描述信息提供一个可用的服务对象.ASP.NET Core ...

  3. ASP.NET Core中的依赖注入(4): 构造函数的选择与服务生命周期管理

    ServiceProvider最终提供的服务实例都是根据对应的ServiceDescriptor创建的,对于一个具体的ServiceDescriptor对象来说,如果它的ImplementationI ...

  4. ASP.NET Core 中的依赖注入

    目录 什么是依赖注入 ASP .NET Core 中使用依赖注入 注册 使用 释放 替换为其它的 Ioc 容器 参考 什么是依赖注入 软件设计原则中有一个依赖倒置原则(DIP),为了更好的解耦,讲究要 ...

  5. ASP.NET Core中的依赖注入(2):依赖注入(DI)

    IoC主要体现了这样一种设计思想:通过将一组通用流程的控制从应用转移到框架之中以实现对流程的复用,同时采用"好莱坞原则"是应用程序以被动的方式实现对流程的定制.我们可以采用若干设计 ...

  6. ASP.NET Core中的依赖注入(5): ServiceProvider实现揭秘 【总体设计 】

    本系列前面的文章我们主要以编程的角度对ASP.NET Core的依赖注入系统进行了详细的介绍,如果读者朋友们对这些内容具有深刻的理解,我相信你们已经可以正确是使用这些与依赖注入相关的API了.如果你还 ...

  7. ASP.NET Core中的依赖注入(5): ServiceProvider实现揭秘 【解读ServiceCallSite 】

    通过上一篇的介绍我们应该对实现在ServiceProvider的总体设计有了一个大致的了解,但是我们刻意回避一个重要的话题,即服务实例最终究竟是采用何种方式提供出来的.ServiceProvider最 ...

  8. ASP.NET Core中的依赖注入(5):ServicePrvider实现揭秘【补充漏掉的细节】

    到目前为止,我们定义的ServiceProvider已经实现了基本的服务提供和回收功能,但是依然漏掉了一些必需的细节特性.这些特性包括如何针对IServiceProvider接口提供一个Service ...

  9. ASP.NET Core 中的 依赖注入介绍

    ASP.NET Core 依赖注入 HomeController public class HomeController : Controller { private IStudentReposito ...

随机推荐

  1. js复制粘贴模板

    <script> //绑定在了body上,也可以绑定在其他可用元素行,但是不是所有元素都支持copy和past事件. /* $(document.body).bind({ copy: fu ...

  2. 在 ASP.NET Core 中集成 Skywalking APM

    前言 大家好,今天给大家介绍一下如何在 ASP.NET Core 项目中集成 Skywalking,Skywalking 是 Apache 基金会下面的一个开源 APM 项目,有些同学可能会 APM ...

  3. 再谈AbstractQueuedSynchronizer3:基于AbstractQueuedSynchronizer的并发类实现

    公平模式ReentrantLock实现原理 前面的文章研究了AbstractQueuedSynchronizer的独占锁和共享锁,有了前两篇文章的基础,就可以乘胜追击,看一下基于AbstractQue ...

  4. spring boot 2.0 集成 shiro 和 pac4j cas单点登录

    新开的项目,果断使用  spring boot  最新版本  2.0.3 ,免得后期升级坑太多,前期把雷先排了. 由于对 shiro 比较熟,故使用 shiro 来做权限控制.同时已经存在了 cas  ...

  5. Python爬虫9-request包介绍及应用

    GitHub代码练习地址:1.两种简单get请求方法:https://github.com/Neo-ML/PythonPractice/blob/master/SpiderPrac13_request ...

  6. C/C++性能测试工具GNU gprof

    代码剖析(Code profiling)程序员在优化软件性能时要注意应尽量优化软件中被频繁调用的部分,这样才能对程序进行有效优化.使用真实的数据,精确的分析应用程序在时间上的花费的行为就成为_代码剖析 ...

  7. Node.js微服务实践(一)

    什么是微服务 微服务是一种架构风格,一个大型复杂软件应用由一个或多个微服务组成.系统中的各个微服务可被独立部署,各个微服务之间是松耦合的.每个微服务仅关注于完成一件任务并很好地完成该任务.在所有情况下 ...

  8. java安装和配置(3.18)

    大家好,我是一名笨笨的程序小白,刚刚学习完C#的基本开发,现在要开始学习java了!我希望在博客园里记录下我的学习日记,我也不敢保证自己会讲的东西多么全面,但是都是比较基础的东西,如果对你也有点点的小 ...

  9. ASP.NET Core DevOps

    一.本系列教程说明 源代码管理工具:Gogs 持续集成工具:Jenkins 容器:Docker 本教程选用轻量级的 Git 管理工具 Gogs,搭建简单. 三.教程目录 1.配置免费HTTPS证书 ( ...

  10. Kubernetes的DaemonSet(上篇)

    背景 静儿作为美团容器化团队HULK的一员,经常需要和Kubernetes(k8s)打交道.第一次登陆node(宿主机)的时候,发现连续登陆几台都看到了Prometheus-Node-Exporter ...