ASP.NET Core 下的依赖注入(一)
本文介绍利用 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":
},
"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. 效果图


谢谢浏览!
ASP.NET Core 下的依赖注入(一)的更多相关文章
- ASP.NET Core中的依赖注入(1):控制反转(IoC)
ASP.NET Core在启动以及后续针对每个请求的处理过程中的各个环节都需要相应的组件提供相应的服务,为了方便对这些组件进行定制,ASP.NET通过定义接口的方式对它们进行了"标准化&qu ...
- ASP.NET Core中的依赖注入(3): 服务的注册与提供
在采用了依赖注入的应用中,我们总是直接利用DI容器直接获取所需的服务实例,换句话说,DI容器起到了一个服务提供者的角色,它能够根据我们提供的服务描述信息提供一个可用的服务对象.ASP.NET Core ...
- ASP.NET Core中的依赖注入(4): 构造函数的选择与服务生命周期管理
ServiceProvider最终提供的服务实例都是根据对应的ServiceDescriptor创建的,对于一个具体的ServiceDescriptor对象来说,如果它的ImplementationI ...
- ASP.NET Core 中的依赖注入
目录 什么是依赖注入 ASP .NET Core 中使用依赖注入 注册 使用 释放 替换为其它的 Ioc 容器 参考 什么是依赖注入 软件设计原则中有一个依赖倒置原则(DIP),为了更好的解耦,讲究要 ...
- ASP.NET Core中的依赖注入(2):依赖注入(DI)
IoC主要体现了这样一种设计思想:通过将一组通用流程的控制从应用转移到框架之中以实现对流程的复用,同时采用"好莱坞原则"是应用程序以被动的方式实现对流程的定制.我们可以采用若干设计 ...
- ASP.NET Core中的依赖注入(5): ServiceProvider实现揭秘 【总体设计 】
本系列前面的文章我们主要以编程的角度对ASP.NET Core的依赖注入系统进行了详细的介绍,如果读者朋友们对这些内容具有深刻的理解,我相信你们已经可以正确是使用这些与依赖注入相关的API了.如果你还 ...
- ASP.NET Core中的依赖注入(5): ServiceProvider实现揭秘 【解读ServiceCallSite 】
通过上一篇的介绍我们应该对实现在ServiceProvider的总体设计有了一个大致的了解,但是我们刻意回避一个重要的话题,即服务实例最终究竟是采用何种方式提供出来的.ServiceProvider最 ...
- ASP.NET Core中的依赖注入(5):ServicePrvider实现揭秘【补充漏掉的细节】
到目前为止,我们定义的ServiceProvider已经实现了基本的服务提供和回收功能,但是依然漏掉了一些必需的细节特性.这些特性包括如何针对IServiceProvider接口提供一个Service ...
- ASP.NET Core 中的 依赖注入介绍
ASP.NET Core 依赖注入 HomeController public class HomeController : Controller { private IStudentReposito ...
随机推荐
- Windows Server 2016-Netdom Join加域并指定OU (一)
前边我们提到了客户端如何通过图形化.netdom .Powershell方式加域,这里我们简单补充下生产环境中如何通过有权限的用户账号加域并指定对应的OU,以防止域策略下发对部分生产服务器权限等内容进 ...
- Storm入门(十二)Twitter Storm: DRPC简介
作者: xumingming | 可以转载, 但必须以超链接形式标明文章原始出处和作者信息及版权声明网址: http://xumingming.sinaapp.com/756/twitter-stor ...
- gulp+ThinkPHP配置
gulp+ThinkPHP配置 gulp+ThinkPHP配置 目录结构: html |-src 开发目录 |-Home 静态页面 |-Public 静态资源目录 |-dist 生产目录 |-Home ...
- vue项目使用 prerender-spa-plugin 预渲染
由于项目要做seo优化,而用vue写成的spa页面谷歌浏览器等是抓取不到数据的.介于ssr和预渲染来说,后者相对来说要简单许多.所以采用了预渲染方式.采用插件prerender-spa-plugin使 ...
- php批量修改文件名称
<?php//利用PHP目录和文件函数遍历用户给出目录的所有的文件和文件夹,修改文件名称function fRename($dirname){ if(!is_dir($dirname)){ ec ...
- javascript权威指南笔记[6-8]
1.三类对象,两类属性 2.原型链只有在查询的时候才会体现 3.对象属性访问 4.属性赋值 5.delete只是断开属性和宿主对象的关系,不会去操作属性中的属性 6.Object.ke() var m ...
- cassandra 堆外内存管理
为什么需要堆外内存呢 单有一些大内存对象的时候,JVM进行垃圾回收时需要收集所有的这些对象的内存也.增加了GC压力.因此需要使用堆外内存. java 分配堆外内存 org.apache.cassand ...
- Python 闭包小记
闭包就是能够读取其他函数内部变量的函数.例如在javascript中,只有函数内部的子函数才能读取局部变量,所以闭包可以理解成“定义在一个函数内部的函数“.在本质上,闭包是将函数内部和函数外部连接起来 ...
- 『集群』003 Slithice 最简分布式(多个客户端,一个独立服务端)
Slithice 最简分布式(多个客户端,一个独立服务端) 案例Demo 展示: 我们搭建一个 可以 独立运行 的 服务端:然后 多个客户端 并发链接 这个 服务端 完成 分布式逻辑: 服务器 独立运 ...
- 【我们一起写框架】MVVM的WPF框架(三)—数据控件
这世上,没人能一次性写出完美无缺的框架:因为,任何一个框架都需要项目的淬炼,然后才能升华,趋近完美. 所以,框架是个反复修改的东西,最终形成的东西. 如果你学了一点技术,觉得自己可以写出框架了,觉得自 ...