https://tech.io/playgrounds/5040/framework-level-dependency-injection-with-asp-net-core

作者: Gunnar Peipman

译者:http://oopsguy.com

1、ASP.NET Core 中的依赖注入

本文将介绍 ASP.NET Core 框架级依赖注入是如何工作的。其简单但功能强大,足以完成大部分依赖注入工作。框架级依赖注入支持以下 scope:

  • Singleton — 总是返回相同的实例,单例
  • Transient — 每次都返回新的实例
  • Scoped — 在当前(request)范围内返回相同的实例

假设我们有两个要通过依赖注入来进行工作的工件:

  • PageContext — 自定义请求上下文
  • Settings — 全局应用程序设置

这两个都是非常简单的类。PageContext 类为布局页面提供当前页面标题的标题标签。

public class Settings
{
public string SiteName;
public string ConnectionString;
} public class PageContext
{
private readonly Settings _settings; public PageContext(Settings settings)
{
_settings = settings;
} public string PageTitle; public string FullTitle
{
get
{
var title = (PageTitle ?? "").Trim(); if(!string.IsNullOrWhiteSpace(title) &&
!string.IsNullOrWhiteSpace(_settings.SiteName))
{
title += " | ";
} title += _settings.SiteName.Trim(); return title;
}
}
}

2、注册依赖

在 UI 构建块中使用这些类之前,你需要在应用程序启动时注册这些类。这些工作可以在 Startup 类的 ConfigureServices() 方法中完成。

public void ConfigureServices(IServiceCollection services)
{
services.AddMvc(); var settings = new Settings();
settings.SiteName = Configuration["SiteName"]; services.AddSingleton(settings);
services.AddScoped<PageContext>();
}

现在可以将这些类注入到支持依赖注入的控制器和其他 UI 组件中。

3、向控制器注入实例

我们通过 Home 控制器中的 PageContext 类分配页面标题。

public class HomeController : Controller
{
private readonly PageContext _pageContext; public HomeController(PageContext pageContext)
{
_pageContext = pageContext;
} public IActionResult Index()
{
_pageContext.PageTitle = ""; return View();
} public IActionResult About()
{
_pageContext.PageTitle = "About"; return View();
}
public IActionResult Error()
{
_pageContext.PageTitle = "Error"; return View();
}
}

这种分配页面标题的方式不错,因为我们不必使用 ViewData,这样更容易被支持多语言应用程序所支持。

4、向视图注入实例

现在控制器的 action 中分配了页面标题,是时候在布局页面中使用标题了。我在页面的内容区域添加了标题,所以在 tech.io 环境中也很容易看到。为了能在布局页面中使用到 PageContext,我使用了视图注入(以下代码片段中的第一行)。

@inject PageContext pageContext
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>@pageContext.FullTitle</title> <environment names="Development">
<link rel="stylesheet" href="~/lib/bootstrap/dist/css/bootstrap.css" />
<link rel="stylesheet" href="~/css/site.css" />
</environment>
<environment names="Staging,Production">
<link rel="stylesheet" href="https://ajax.aspnetcdn.com/ajax/bootstrap/3.3.7/css/bootstrap.min.css"
asp-fallback-href="~/lib/bootstrap/dist/css/bootstrap.min.css"
asp-fallback-test-class="sr-only" asp-fallback-test-property="position" asp-fallback-test-value="absolute" />
<link rel="stylesheet" href="~/css/site.min.css" asp-append-version="true" />
</environment>
</head>
...
</html>

5、参考材料

ASP.NET Core 中的框架级依赖注入的更多相关文章

  1. Asp.Net Core 中利用QuartzHostedService 实现 Quartz 注入依赖 (DI)

    QuartzHostedService  是一个用来在Asp.Net Core 中实现 Quartz 的任务注入依赖的nuget 包: 基本示例如下: using System; using Syst ...

  2. ASP.NET MVC中使用Unity进行依赖注入的三种方式

    在ASP.NET MVC中使用Unity进行依赖注入的三种方式 2013-12-15 21:07 by 小白哥哥, 146 阅读, 0 评论, 收藏, 编辑 在ASP.NET MVC4中,为了在解开C ...

  3. ASP.NET Core MVC 控制器创建与依赖注入

    本文翻译自<Controller activation and dependency injection in ASP.NET Core MVC>,由于水平有限,故无法保证翻译完全准确,欢 ...

  4. Asp.Net Core 第04局:依赖注入

    总目录 前言 本文介绍Asp.Net Core中默认的依赖注入(DI)模式. 环境 1.Visual Studio 2017 2.Asp.Net Core 2.2 开局 第一手:依赖注入说明 1.一个 ...

  5. ASP.NET Core 学习笔记 第二篇 依赖注入

    前言 ASP.NET Core 应用在启动过程中会依赖各种组件提供服务,而这些组件会以接口的形式标准化,这些组件这就是我们所说的服务,ASP.NET Core框架建立在一个底层的依赖注入框架之上,它使 ...

  6. ASP.NET Core中使用Autofac进行属性注入

    一些无关紧要的废话: 作为一名双修程序员(自封的),喜欢那种使用Spring的注解形式进行依赖注入或者Unity的特性形式进行依赖注入,当然,形式大同小异,但结果都是一样的,通过属性进行依赖注入. A ...

  7. ASP.NET Core 1.0基础之依赖注入

      来源https://docs.asp.net/en/latest/fundamentals/dependency-injection.html ASP.NET Core 1.0在设计上原生就支持和 ...

  8. asp.net core 系列之Dependency injection(依赖注入)

    这篇文章主要讲解asp.net core 依赖注入的一些内容. ASP.NET Core支持依赖注入.这是一种在类和其依赖之间实现控制反转的一种技术(IOC). 一.依赖注入概述 1.原始的代码 依赖 ...

  9. ASP.NET Core应用的7种依赖注入方式

    ASP.NET Core框架中的很多核心对象都是通过依赖注入方式提供的,如用来对应用进行初始化的Startup对象.中间件对象,以及ASP.NET Core MVC应用中的Controller对象和V ...

随机推荐

  1. '增量赋值(augmented assignment)', 多么痛的领悟!

    '增量赋值(augmented assignment)', 多么痛的领悟! 深刻理解x += a 与 x = x + a 的不同: 按理说上面的两条语句是等价的, 功能上完全一样的. 之所以说不同, ...

  2. 200行代码实现RPC框架

    之前因为项目需要,基于zookeeper和thrift协议实现了一个简单易用的RPC框架,核心代码不超过200行. zookeeper主要作用是服务发现,thrift协议作为通信传输协议, 基于com ...

  3. 第6月第10天 svn checkout sqlite3

    1. http://www.cnblogs.com/xuling/p/5602036.html 2. http://blog.csdn.net/qq_26819733/article/details/ ...

  4. innodb和myisam数据库文件存储详解以及mysql表空间

    数据库常用的两种引擎有Innodb和Myisam,关于二者的区别参考:https://www.cnblogs.com/qlqwjy/p/7965460.html 1.关于数据库的存储在两种引擎的存储是 ...

  5. mysql Keepalived 实践

    Keepalived 是一种高性能的服务器高可用或热备解决方案,Keepalived可以用来防止服务器单点故障(单点故障是指一旦某一点出现故障就会导致整个系统架构的不可用)的发生,通过配合Nginx可 ...

  6. MVC Autofac依赖注入

    通过Dll实现全部类的属性注入,该演示实例主要通过多层架构中单一的对象方式来演示,没有采取接口的方式, 新建AutoFacHelper类,如下代码: public class AutoFacHelpe ...

  7. XSS代码注入框架

    首先需要了解一下几点: 1.浏览器中Javascript变量的生命周期 Javascript变量的生命周期并不是你声明这个变量个窗口闭就被回收,只要有引用就会一直持续到浏览器关闭. 2.window对 ...

  8. Ext.util.Format.date 时间格式的设置与转换

    Ext.util.Format.date 如下这段简单的代码:  var d = new Date(value.time); var s = Ext.util.Format.date(d, 'Y-m- ...

  9. Mac 命令行安装 dmg文件

    1.安装dmg文件 hdiutil attach jdk-9.0.1_osx-x64_bin.dmg 会挂载在 /Volumes 目录下 2.安装pkg文件(可以 man installer 查看命令 ...

  10. sonarLint--强大的代码审查工具(插件)

    idea也有的一个插件 贴上一个eclipse的sonarlint用法 http://blog.csdn.net/limm33/article/details/51166840 不过听说从2015年1 ...