161

ASP.NET Core 中的框架级依赖注入 | Oopsguy

 6 years ago
source link: http://oopsguy.com/2017/10/23/dependency-injection-with-asp-net-core/?
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

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、参考材料

本作品采用知识共享署名 4.0 国际许可协议进行许可,转载请保留原文和译文链接及作者版本信息。

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK