前言

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


本文地址:http://www.cnblogs.com/savorboard/p/dotnetcore-json-config-di.html

作者博客:Savorboard

欢迎转载,请在明显位置给出出处及链接

ASP.NET Core 在 JSON 文件中配置依赖注入的更多相关文章

  1. 转载:ASP.NET Core 在 JSON 文件中配置依赖注入

    在以前的 ASP.NET 4+ (MVC,Web Api,Owin,SingalR等)时候,都是提供了专有的接口以供使用第三方的依赖注入组件,比如我们常用的会使用 Autofac.Untiy.Stri ...

  2. asp.net core mvc 在中间件中使用依赖注入问题:System.InvalidOperationException: Cannot resolve scoped service 'IXXXService' from root provider.

    今天在弄JWT的时候需要用到用户验证使用一个自己写好的验证,但在出现了:System.InvalidOperationException: Cannot resolve scoped service ...

  3. ASP.NET Core appsettings.json 文件

    ASP.NET Core appsettings.json 文件 在本节中,我们将讨论 ASP.NET Core 项目中appsettings.json文件的重要性. 在以前的 ASP.NET 版本中 ...

  4. ASP.NET Core launchsettings.json 文件

    ASP.NET Core launchsettings.json 文件 在本节中,我们将讨论在 ASP.NET Core 项目中launchsettings.json文件的重要性. launchset ...

  5. [ASP.NET Core开发实战]基础篇02 依赖注入

    ASP.NET Core的底层机制之一是依赖注入(DI)设计模式,因此要好好掌握依赖注入的用法. 什么是依赖注入 我们看一下下面的例子: public class MyDependency { pub ...

  6. ASP.NET Core如何在ActionFilterAttribute里做依赖注入

    在ASP.NET Core里,我们可以使用构造函数注入很方便地对Controller,ViewComponent等部件做依赖注入.但是如何给过滤器ActionFilterAttribute也用上构造函 ...

  7. ASP.NET Core 2.2 基础知识(一) 依赖注入

    依赖: 类A用到了类B,我们就说类A依赖类B.如果一个类没有任何地方使用到,那这个类基本上可以删掉了. public class Test { private MyDependency md = ne ...

  8. ASP.NET Core 学习笔记 第三篇 依赖注入框架的使用

    前言 首先感谢小可爱门的支持,写了这个系列的第二篇后,得到了好多人的鼓励,也更加坚定我把这个系列写完的决心,也能更好的督促自己的学习,分享自己的学习成果.还记得上篇文章中最后提及到,假如服务越来越多怎 ...

  9. Asp.Net Core 进阶(三)—— IServiceCollection依赖注入容器和使用Autofac替换它

    Asp.Net Core 提供了默认的依赖注入容器 IServiceCollection,它是一个轻量级的依赖注入容器,所以功能不多,只是提供了基础的一些功能,要实现AOP就有点麻烦,因此在实际工作当 ...

随机推荐

  1. Android SwipeRefreshLayout 下拉刷新——Hi_博客 Android App 开发笔记

    以前写下拉刷新 感觉好费劲,要判断ListView是否滚到顶部,还要加载头布局,还要控制 头布局的状态,等等一大堆.感觉麻烦死了.今天学习了SwipeRefreshLayout 的用法,来分享一下,有 ...

  2. 调用AJAX做登陆和注册

    先建立一个页面来检测一下我们建立的用户名能不能用,看一下有没有已经存在的用户名吗 可以通过ajax提示一下 $("#uid").blur(function(){ //取用户名 va ...

  3. JavaScript中fn()和return fn()

    看博客时,注意到return的重要性 参考:http://www.cnblogs.com/raoyunxiao/p/5644032.html 看似反常的例子: var i = 0; function ...

  4. 【原创经验分享】WCF之消息队列

    最近都在鼓捣这个WCF,因为看到说WCF比WebService功能要强大许多,另外也看了一些公司的招聘信息,貌似一些中.高级的程序员招聘,都有提及到WCF这一块,所以,自己也关心关心一下,虽然目前工作 ...

  5. “RazorEngine.Templating.TemplateParsingException”类型的异常在 RazorEngine.NET4.0.dll 中发生,但未在用户代码中进行处理 其他信息: Expected model identifier.

    这个问题是由于在cshtml中 引用了model这个单词  它可能和Model在解析时有冲突. 解决方法:把model换成别的单词就可以了.

  6. WPF 捕获键盘输入事件

    最近修改的一个需求要求捕获键盘输入的 Text,包括各种标点符号. 最开始想到的是 PreviewKeyDown 或者 PreviewKeyUp 这样的键盘事件. 但是这两个事件的对象 KeyEven ...

  7. 【C#公共帮助类】 Utils 10年代码,最全的系统帮助类

    为大家分享一下个人的一个Utils系统帮助类,可能有些现在有新的技术替代,自行修改哈~ 这个帮助类主要包含:对象转换处理 .分割字符串.截取字符串.删除最后结尾的一个逗号. 删除最后结尾的指定字符后的 ...

  8. Spring aop应用之实现数据库读写分离

    Spring加Mybatis实现MySQL数据库主从读写分离 ,实现的原理是配置了多套数据源,相应的sqlsessionfactory,transactionmanager和事务代理各配置了一套,如果 ...

  9. 张小龙宣布微信小程序1月9日发布,并回答了大家最关心的8个问题

    2016 年 12 月 28 日,张小龙在微信公开课 PRO 版的会场上,宣布了微信小程序的正式发布时间. 微信小程序将于 2017 年 1 月 9 号正式上线. 同时他解释称,小程序就像PC时代的网 ...

  10. 从史上八大MySQL事故中学到的经验

    本文列举了史上八大MySQL宕机事件原因.影响以及人们从中学到的经验,文中用地震级数来类比宕机事件的严重性和后果,排在最严重层级前两位的是由于亚马逊AWS宕机故障(相当于地震十级和九级). 一.Per ...