全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

详解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文件中,这只是一个简单的实例,不要用在生产环境中。在实际的项目中你还需要处理关于读取配置异常情况,服务是否存在的异常情况,生命周期等等这些问题。


# asp.net  # core  # json  # .net  # 依赖注入  # core依赖注入json  # ASP.NET Core配置文件的获取和设置  # ASP.NET CORE读取json格式配置文件  # ASP.NET Core读取配置文件  # ASP.NET Core应用程序配置文件AppSetting.json  # ASP.NET Core根据环境变量支持多个 appsettings.json配置文件  # ASP.NET Core中修改配置文件后自动加载新配置的方法详解  # Asp.net Core与类库读取配置文件信息的方法  # 如何在ASP.NET Core类库项目中读取配置文件详解  # ASP.NET core Web中使用appsettings.json配置文件的方法  # 如何使用ASP.NET Core 配置文件  # 微软  # 给我们  # 第三方  # 来实现  # 创建一个  # 配置文件  # 以供  # 都是  # 是一个  # 多个  # 给大家  # 可以直接  # 这只  # 写了  # 还需要  # 都将  # 可供  # 当我们  # 来做  # 上都 


相关文章: 如何选择建站程序?包含哪些必备功能与类型?  php8.4新语法match怎么用_php8.4match表达式替代switch【方法】  大连企业网站制作公司,大连2025企业社保缴费网上缴费流程?  建站之星免费版是否永久可用?  小型网站制作HTML,*游戏网站怎么搭建?  陕西网站制作公司有哪些,陕西凌云电器有限公司官网?  广州美橙建站如何快速搭建多端合一网站?  如何在Mac上搭建Golang开发环境_使用Homebrew安装和管理Go版本  网站制作报价单模板图片,小松挖机官方网站报价?  如何在Windows 2008云服务器安全搭建网站?  全景视频制作网站有哪些,全景图怎么做成网页?  C++如何编写函数模板?(泛型编程入门)  如何在万网开始建站?分步指南解析  北京网站制作费用多少,建立一个公司网站的费用.有哪些部分,分别要多少钱?  建站主机如何安装配置?新手必看操作指南  如何用狗爹虚拟主机快速搭建网站?  如何生成腾讯云建站专用兑换码?  如何在阿里云域名上完成建站全流程?  建站一年半SEO优化实战指南:核心词挖掘与长尾流量提升策略  制作网站外包平台,自动化接单网站有哪些?  SQL查询语句优化的实用方法总结  网站制作专业公司有哪些,如何制作一个企业网站,建设网站的基本步骤有哪些?  制作网站哪家好,cc、.co、.cm哪个域名更适合做网站?  如何构建满足综合性能需求的优质建站方案?  广州网站制作的公司,现在专门做网站的公司有没有哪几家是比较好的,性价比高,模板也多的?  网站制作公司广州有几家,广州尚艺美发学校网站是多少?  制作网站怎么制作,*游戏网站怎么搭建?  如何用搬瓦工VPS快速搭建个人网站?  电商网站制作公司有哪些,1688网是什么意思?  Java解压缩zip - 解压缩多个文件或文件夹实例  潮流网站制作头像软件下载,适合母子的网名有哪些?  如何快速生成专业多端适配建站电话?  如何快速选择适合个人网站的云服务器配置?  rsync同步时出现rsync: failed to set times on “xxxx”: Operation not permitted  教学网站制作软件,学习*后期制作的网站有哪些?  网站制作价目表怎么做,珍爱网婚介费用多少?  如何通过虚拟机搭建网站?详细步骤解析  定制建站流程步骤详解:一站式方案设计与开发指南  香港服务器建站指南:免备案优势与SEO优化技巧全解析  如何通过山东自助建站平台快速注册域名?  高端建站如何打造兼具美学与转化的品牌官网?  如何快速打造个性化非模板自助建站?  如何解决ASP生成WAP建站中文乱码问题?  在线教育网站制作平台,山西立德教育官网?  广州顶尖建站服务:企业官网建设与SEO优化一体化方案  linux top下的 minerd 木马清除方法  标准网站视频模板制作软件,现在有哪个网站的视频编辑素材最齐全的,背景音乐、音效等?  南阳网站制作公司推荐,小学电子版试卷去哪里找资源好?  建站之星如何取消后台验证码生成?  建站主机与服务器功能差异如何区分? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。