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. 【转】CocoaLumberjack——带颜色的Log

    CHENYILONG Blog [转]CocoaLumberjack--带颜色的Log - 趣味苹果开发 - 博客园 转自:趣味苹果开发   CocoaLumberjack--带颜色的Log Coco ...

  2. HDU 4506 小明系列故事——师兄帮帮忙(二分快速幂)

    题意:就是输入一个数组,这个数组在不断滚动,而且每滚动一次后都要乘以一个数,用公式来说就是a[i] = a[i-1] * k;然后最后一位的滚动到第一位去. 解题报告:因为题目中的k要乘很多次,达到了 ...

  3. [转]OpenMP 入门指南

    简介 这门课作为 ECE 中少有的跟计算机科学相关的课,自然是必上不可.不过无论是 OpenMP 还是 CUDA,对于平时极少接触并行编程的我来说,都是十分吃力的,第一次作业的 OpenMP 编程已经 ...

  4. CSS3设置内容超过一定长度后自动折行

    在用编辑器保存的数据到数据库的时候经常是在我们的内容前后加一个P标签,但是出来之后是一行,有时候会超过边框的宽度,所以研究了如何折行,如下代码: <!DOCTYPE html> <h ...

  5. 【Linux高级驱动】input子系统框架【转】

    转自:http://www.cnblogs.com/lcw/p/3802617.html [1.input子系统框架(drivers\input)] 如何得出某个驱动所遵循的框架?    1) 通过网 ...

  6. RESET MASTER和RESET SLAVE使用场景和说明【转】

    [前言]在配置主从的时候经常会用到这两个语句,刚开始的时候还不清楚这两个语句的使用特性和使用场景. 经过测试整理了以下文档,希望能对大家有所帮助: [一]RESET MASTER参数 功能说明:删除所 ...

  7. vs中如何统计整个项目的代码行数

    在一个大工程中有很多的源文件和头文件,如何快速统计总行数? ------解决方案--------------------b*[^:b#/]+.*$^b*[^:b#/]+.*$ ctrl + shift ...

  8. Python学习五|集合、布尔、字符串的一些特点

    #集合本身就像无值的字典 list1 = set([1,2,3,4]) list2 = {1,2,3,4} print('list1 == list2?:',list1==list2)#list1 = ...

  9. python抓取猫眼电影列表

    抓取地址:http://maoyan.com/board/4 分析url分页规则:http://maoyan.com/board/4?offset=0 其中offset参数值为0到90 用到的库: P ...

  10. java 重新抛出异常

    一.有时希望把刚捕获的异常重新抛出,尤其时在使用Exception捕获所以异常的时候,既然已经得到了对当前异常对象的引用,可以重新把它抛出: catch(Exception e){ System.ou ...