详解ASP.NET Core 在 JSON 文件中配置依赖注入

前言

在上一篇文章中写了如何在MVC中配置全局路由前缀,今天给大家介绍一下如何在在 json 文件中配置依赖注入。

在以前的 ASP.NET 4+ (MVC,Web Api,Owin,SingalR等)时候,都是提供了专有的接口以供使用第三方的依赖注入组件,比如我们常用的会使用 Autofac、Untiy、String.Net 等,这些第三放依赖注入组件基本上都提供了一套配置注入或者配置生命周期的方式,除了直接配置到类里面之外,还提供了要么使用 xml 文件,要么使用 json 等,那么在新的 ASP.NET Core 中微软已经默认的给我们提供了一个依赖注入的功能,我们就不再需要借助于第三方组件来实现依赖注入了,但是有时候我们想在配置文件中来配置依赖注入,微软本身的 DI 组件并没有给我们提供一个可供配置的文件,那么我们就需要自己来实现这个配置项的功能。个人觉得其主要使用场景是一些在编译时不能确定实现的,需要动态修改实现的地方。

下面就来看看应该如何来做这件事情吧。

Getting Started

首先,在应用程序中我们创建一个接口,以供 DI使用:

public interface IFoo
{
  string GetInputString(string input);
}

然后,添加一个 IFoo 接口的实现 Foo

public class Foo : IFoo
{
  public string GetInputString(string input)
  {
    return $"输入的字符串为:{ input }";
  }
}

接下来,我们需要把以上的 IFoo 接口和它的实现添加到 Startup.cs 文件中的ConfigureServices方法中,ConfigureServices 主要是用来配置依赖注入服务的。然后通过该方法提供的ISerciceCollection接口参数注入 Services。

public void ConfigureServices(IServiceCollection services)
{
  services.Add(new ServiceDescriptor(serviceType: typeof(IFoo),
                    implementationType: typeof(Foo),
                    lifetime: ServiceLifetime.Transient));
}

这里,我们使用到了 IServiceCollection 里面的 Add 方法,添加一个生命周期为瞬态的 IFoo 的实现。瞬态就是说在每次请求的时候都将创建一个Foo的实例。

以上是默认微软为我们提供的添加依赖注入的方法,下面我们来看一下怎么来改造成我们需要的使用 json 文件的方式。

使用 json 文件配置 DI

当我们使用json文件配置依赖注入的时候,可以选择新建一个json文件,也可以直接使用 appsettings.json 文件。现在我们就直接在 appsettings.json 文件中添加关于DI的配置了。

appsettings.json

 "Logging": {
  "IncludeScopes": false,
  "LogLevel": {
   "Default": "Debug",
   "System": "Information",
   "Microsoft": "Information"
  }
 },

 "DIServices": [
  {
   "serviceType": "[namesapce].IFoo",
   "implementationType": "[namesapce].Foo",
   "lifetime": "Transient"
  }
 ]
}

首先,添加一个名为 “DIServices” 的数组节点,数组中包含一个或多个配置service的对象,serviceType代表服务接口的类型,implementationType接口的实现,lifetime 初始化实例的生命周期。

注意:配置文件中的类型必须为全名称,即包含命名空间。

接下来,添加一个和Json文件配置项相对应的一个service类,这里我们需要使用 Newtonsoft 这个json库。

using Microsoft.Extensions.DependencyInjection;
using Newtonsoft.Json;
using Newtonsoft.Json.Converters;

public class Service
{
  public string ServiceType { get; set; }

  public string ImplementationType { get;set; }

  [JsonConverter(typeof(StringEnumConverter))]
  public ServiceLifetime Lifetime { get; set; }
}

然后需要改造一下ConfigureServices,在 ConfigureServices 中读取配置的 json文件即可。

public void ConfigureServices(IServiceCollection services)
{
  //services.Add(new ServiceDescriptor(serviceType: typeof(IFoo),
  //            implementationType: typeof(Foo),
  //            lifetime: ServiceLifetime.Transient));

  var jsonServices = JObject.Parse(File.ReadAllText("appSettings.json"))["DIServices"];
  var requiredServices = JsonConvert.DeserializeObject<List<Service>>(jsonServices.ToString());

  foreach (var service in requiredServices) {
    services.Add(new ServiceDescriptor(serviceType: Type.GetType(service.ServiceType),
                      implementationType: Type.GetType(service.ImplementationType),
                      lifetime: service.Lifetime));
  }
}

然后我们测试一下是否是可用的。

测试

打开 HomeController.cs ,添加注入项:

public class HomeController : Controller
{
  private readonly IFoo _foo;

  public HomeController(IFoo foo)
  {
    _foo = foo;
  }

  public IActionResult About()
  {
    ViewData["Message"] = _foo.GetInputString("Your application description page.");

    return View();
  }
}

在 HomeController的构造函数添加IFoo接口,然后在 About 的Action中使用。

运行程序,打开页面,点击 About标签

总结

以上即为在 ASP.NET Core 中配置依赖注入到json文件中,这只是一个简单的实例,不要用在生产环境中。在实际的项目中你还需要处理关于读取配置异常情况,服务是否存在的异常情况,生命周期等等这些问题。

时间: 2017-02-02

.NET Core 2.0迁移小技巧之web.config 配置文件示例详解

前言 相信大家应该都知道.NET Core现在不再支持原来的web.config配置文件了,取而代之的是json或xml配置文件.官方推荐的项目配置方式是使用appsettings.json配置文件,这对现有一些重度使用web.cofig配置的项目迁移可能是不可接受的. 但是好消息是,我们是可以直接在.NET Core 2.0项目种利用上现有的web.config的.本文将详细介绍.NET Core 2.0迁移之web.config 配置文件的相关内容,下面话不多说了,来一起看看详细的介绍吧.

如何在ASP.NET Core类库项目中读取配置文件详解

前言 最近有朋友问如何在.net core类库中读取配置文件,当时一下蒙了,这个提的多好,我居然不知道,于是这两天了解了相关内容才有此篇文章的出现,正常来讲我们在应用程序目录下有个appsettings.json文件对于相关配置都会放在这个json文件中,但是要是我建立一个类库项目,对于一些配置比如密钥或者其他需要硬编码的数据放在JSON文件中,在.net core之前配置文件为web.config并且有相关的类来读取节点上的数据,现如今在.net core中为json文件,那么我们该如何做?本

ASP.NET core Web中使用appsettings.json配置文件的方法

前言 最近在研究把asp.net程序移植到linux上,正好.net core出来了,就进行了学习. 移植代码基本顺利,但是发现.net core中没有ConfigurationManager,无法读写配置文件,单独写个xml之类的嫌麻烦,就谷歌了下,发现了个方法,遂记录如下,方便以后查找: 方法如下 配置文件结构 public class DemoSettings { public string MainDomain { get; set; } public string SiteName {

ASP.NET Core Web App应用第三方Bootstrap模板的方法教程

引言 作为后端开发来说,前端表示玩不转,我们一般会选择套用一些开源的Bootstrap 模板主题来进行前端设计.那如何套用呢?今天就简单创建一个ASP.NET Core Web MVC 模板项目为例,来应用第三方Bootstrap Template--Admin LTE. AdminLte Dashboard 1. 创建ASP.NET Core MVC Demo 命令行执行dotnet new mvc -n ApplyBootstrapTemplate,即可创建预置的MVC模板项目.项目结构如下

ASP.NET Core WebApi中使用FluentValidation验证数据模型的方法

介绍 验证用户输入是一个Web应用中的基本功能.对于生产系统,开发人员通常需要花费大量时间,编写大量的代码来完成这一功能.如果我们使用FluentValidation构建ASP.NET Core Web API,输入验证的任务将比以前容易的多. FluentValidation是一个非常流行的构建强类型验证规则的.NET库. 配置项目 第一步:下载FluentValidation 我们可以使用Nuget下载最新的 FluentValidation 库 PM> Install-Package Fl

如何给ASP.NET Core Web发布包做减法详解

1.引言 紧接上篇:ASP.NET Core Web App应用第三方Bootstrap模板.这一节我们来讲讲如何优化ASP.NET Core Web发布包繁重的问题. 在ASP.NET Core Web App中我们可以通过Bower或NPM来安装一些JS.CSS插件,来方便我们组织前端组件.但是这也给我带来了一个问题,那就是发布时需要把安装的Bower包或NPM包都要打包上传到服务器. 如果现在发布ASP.NET Core Web App,wwwroot下已包含到项目中的文件都会被发布.虽然

ASP.NET Core根据环境变量支持多个 appsettings.json配置文件

一.背景 在项目开发的过程当中,开发环境与生产环境的配置肯定是不一样的.拿个最简单的例子来说,比如连接字符串这种东西,开发环境肯定不能连生产数据库.在之前的话,这种情况基本靠准备两个同名的配置文件来进行处理,然后你在本地就使用本地的配置文件,生产环境就使用生产环境的配置文件,十分麻烦. ASP.NET Core支持利用环境变量来动态配置 JSON 文件,下面就来看一下如何在项目中使用这样功能吧. 二.准备工作 ASP.NET Core在应用启动时读取环境变量ASPNETCORE_ENVIRONM

Asp.Net Core Web应用程序—探索

前言 作为一个Windows系统下的开发者,我对于Core的使用机会几乎为0,但是考虑到微软的战略规划,我觉得,Core还是有先了解起来的必要. 因为,目前微软已经搞出了两个框架了,一个是Net标准(.NetFramework),一个是Net Core. 而新特性的更新几乎都是在Net Core这个框架中. 所以,考虑到未来,一旦Core完善了,那微软肯定会放弃现在的.NetFrameWork. 因此,.Net程序员集体改用Net Core,想来,一定是大趋势. 所以让我们怀着探索的精神来看看A

详解在Azure上部署Asp.NET Core Web App

在云计算大行其道的时代,当你要部署一个网站时第一选择肯定是各式各样的云端服务.那么究竟使用什么样的云端服务才能够以最快捷的方式部署一个 ASP.NET Core的网站呢?Azure 的 Web App 服务是个很好的选择. 下面我们会通过 Visual Studio 创建一个 Asp.net Core demo 应用,然后把这个 demo 应用部署到 Azure Web App.通过阅读本文,您将能了解到如何创建 Asp.NET Core 应用程序和如何在Azure上创建 Web App 并部署

ASP.NET Core SignalR中的流式传输深入讲解

前言 什么是流式传输? 流式传输是这一种以稳定持续流的形式传输数据的技术. 流式传输的使用场景 有些场景中,服务器返回的数据量较大,等待时间较长,客户端不得不等待服务器返回所有数据后,再进行相应的操作.这时候使用流式传输,可以将服务器数据碎片化,当每个数据碎片读取完成之后,就只传输完成的部分,而不需要等待所有数据都读取完成. SignalR SignalR是一个.NET Core/.NET Framework的开源实时框架. SignalR的可使用Web Socket, Server Sent

ASP.NET Core应用中与第三方IoC/DI框架的整合

一.ConfigureServices方法返回的ServiceProvider没有用! 我们可以通过一个简单的实例来说明这个问题.我们先定义了如下这个一个MyServiceProvider,它实际上是对另一个ServiceProvider的封装.简单起见,我们利用一个字典来保存服务接口与实现类型的映射关系,这个关系可以通过调用Registe方法来注册.在提供服务实例的GetService方法中,如果提供的服务类型已经被注册,我们会创建并返回对应的实例对象,否则我们将利用封装的这个ServiceP

Asp.net Core MVC中怎么把二级域名绑定到特定的控制器上

应用场景:企业门户网站会根据内容不同,设置不同的板块,如新浪有体育,娱乐频道,等等.有的情况下需要给不同的板块设置不同的二级域名,如新浪体育sports.sina.com.cn. 在asp.net core mvc中,如果要实现板块的效果,可能会给不同的板块建立不同的控制器(当然也有其他的技术,这里不讨论实现方式的好坏),在这种情况下,如何给控制器绑定上独有的二级域名,比如体育频道对应的控制器叫SportController,通过sports.XXX.com域名访问系统的时候,直接进入Sport