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

1. appsettings.json 中定义配置

假设我们有如下配置:

{"Logging": {"LogLevel": {"Default": "Information","Microsoft": "Warning","Microsoft.Hosting.Lifetime": "Information"}},"AllowedHosts": "*","Tecent": {"Qzone": {"Url": "http://i.qq.com","CName": "QQ空间","Age": 15},"Weixin": {}}
}

2. 定义配置模型类

    public interface ITecentConfig{QzoneConfig Qzone { get; set; }}

    public class TecentConfig : ITecentConfig{public QzoneConfig Qzone { get; set; }}

    public class QzoneConfig{public string Url { get; set; }public string CName { get; set; }public int Age { get; set; }}

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

4.  编写 ServiceCollection 的扩展方法

    public static class ServiceCollectionExtensions{public static void ConfigureApplicationServices(this IServiceCollection services, IConfiguration configuration){ITecentConfig tencentConfig = services.ConfigureStartupConfig<ITecentConfig, TecentConfig>(configuration.GetSection("Tecent"));//由于已经通过依赖注入了,并且单例模式,下面通过依赖注入读取配置。
            }public static TConfig ConfigureStartupConfig<TConfig>(this IServiceCollection services, IConfiguration configuration) where TConfig : class, new(){if (services == null)throw new ArgumentNullException(nameof(services));if (configuration == null)throw new ArgumentNullException(nameof(configuration));var config = new TConfig();configuration.Bind(config);services.AddSingleton(config);//.NET Core DI 为我们提供的实例生命周其包括三种://Transient: 每一次GetService都会创建一个新的实例//Scoped:  在同一个Scope内只初始化一个实例 ,可以//          理解为( 每一个request级别只创建一个实例,同一个http request会在一个 scope内)//Singleton :整个应用程序生命周期以内只创建一个实例return config;}public static IConfig ConfigureStartupConfig<IConfig, ConfigImpl>(this IServiceCollection services, IConfiguration configuration)where ConfigImpl : class, IConfig, new(){if (services == null)throw new ArgumentNullException(nameof(services));if (configuration == null)throw new ArgumentNullException(nameof(configuration));var config = new ConfigImpl();configuration.Bind(config);services.AddSingleton(typeof(IConfig), config);return config;}}

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

5. 在 Startup.cs 中注册服务

    public class Startup{public Startup(IConfiguration configuration){Configuration = configuration;}public IConfiguration Configuration { get; }public void ConfigureServices(IServiceCollection services){services.Configure<CookiePolicyOptions>(options =>{options.CheckConsentNeeded = context => true;});services.ConfigureApplicationServices(Configuration);//注册我们自定义的服务//注册自定义的模型绑定
            services.AddMvc().AddNewtonsoftJson();services.AddRazorPages();}
}

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

    public class HomeController : Controller{private ITecentConfig _tecentConfig;public HomeController(ITecentConfig tecentConfig){_tecentConfig = tecentConfig;}public IActionResult About(){return Content(string.Format("这个是 About 介绍。{0}: {1}。HashCode:{2}", _tecentConfig.Qzone.CName, _tecentConfig.Qzone.Url,_tecentConfig.GetHashCode()));}}

7. 效果图

谢谢浏览!

转载于:https://www.cnblogs.com/Music/p/dependency-injection-01-in-asp-net-core.html

ASP.NET Core 下的依赖注入(一)相关推荐

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

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

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

    什么是依赖注入 软件设计原则中有一个依赖倒置原则(DIP),为了更好的解耦,讲究要依赖于抽象,不要依赖于具体.而控制反转(Ioc)就是这样的原则的其中一个实现思路, 这个思路的其中一种实现方式就是依赖 ...

  3. ASP.NET Core 2.0 依赖注入

    问题 如何使用 ASP.NET Core 服务容器进行依赖注入? 答案 创建一个服务 public interface IGreetingService { string Greet(string t ...

  4. ASP.NET Core MVC 之依赖注入 Controller

    ASP.NET Core MVC 控制器应通过构造函数明确地请求它们地依赖关系,在某些情况下,单个控制器地操作可能需要一个服务,在控制器级别上的请求可能没有意义.在这种情况下,也可以将服务作为  Ac ...

  5. ASP.NET Core MVC 之依赖注入 View

    ASP.NET Core 支持在试图中使用依赖注入.这将有助于提供视图专用的服务,比如本地化或者仅用于填充视图元素的数据.应尽量保持控制器和视图之间的关注点分离.视图所显示的大部分数据应该从控制器传入 ...

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

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

  7. winform防止sqlserver注入_ASP.NET Core 中的 依赖注入介绍

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

  8. 拥抱.NET Core系列:依赖注入(2)

    上一篇"拥抱.NET Core系列:依赖注入(1)大体介绍了服务注册.获取和生命周期,这一篇来做一些补充.由于内容跨度大(.NET Core.ASP.NET Core),所以文章并不是非常的 ...

  9. ASP.NET Core下FreeSql的仓储事务

    ASP.NET Core下FreeSql的仓储事务 山柏小说网 https://www.5186.info 第一步:配置 Startup.cs 注入 引入包 dotnet add package Fr ...

最新文章

  1. 大神教你实现redis键空间通知
  2. static和构造函数初始化顺序
  3. 2021-9-下旬 数据结构 - 线性表 - 循环链表 - java实现代码(复习用)
  4. JavaScript之使用AJAX(适合初学者)
  5. 【翻译】理念:无冲突的扩展本地DOM原型
  6. 树结构遍历节点名字提取,这里提取的是el-tree数据结构,封装成函数
  7. ViewPager循环
  8. [html] 网页中的友情链接有什么作用?
  9. NPL之如何使用Glove--词向量转化
  10. pythoncsv数据类型_pandas读取CSV文件时查看修改各列的数据类型格式
  11. 制药工程专业计算机二级,全国制药工程本科专业认证标准2016年12月修订.pdf
  12. string-indexOf、substring、split
  13. DOM 其他一些特性
  14. robotframework 接口测试 +RSA 加密
  15. 嵌入式技术与应用专业毕业以后可以做什么?
  16. 商人过河c语言实验报告,商人过河C语言程序编程
  17. 【转载】一个程序猿必须会玩的游戏
  18. Pycharm 报错Out of Memory 然后一直闪退(已解决)
  19. spark.read.jdbc 并发设置
  20. 一个电脑板绘初学者的自述,设计基础

热门文章

  1. Ubuntu服务器修复,ubuntu – 服务器攻击,如何修复它
  2. 月薪2万的90后程序员!哪些岗位和公司才是他们的首选?
  3. 使用这些思路与技巧,我读懂了多个优秀的开源项目
  4. Java、JavaScript、C/C++、Python分别用来开发什么?
  5. linux安全基线检查,CentOS Linux 7安全基线检查
  6. php的foreach什么意思,php中foreach的用法是什么,php foreach as
  7. c++两个文档匹配数据_《搜索和推荐中的深度匹配》——1.2 搜索和推荐中匹配统一性...
  8. 安卓linux终端 计算,5种在Linux终端中进行算术运算的方法
  9. 视频点播服务器实现视频转码和视频播出功能
  10. C语言学习笔记---结构体数组初始化