详解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); } 然后,添加一个 public class Foo : IFoo { public string GetInputString(string input) { return $"输入的字符串为:{ input }"; } } 接下来,我们需要把以上的 public void ConfigureServices(IServiceCollection services) { services.Add(new ServiceDescriptor(serviceType: typeof(IFoo),implementationType: typeof(Foo),lifetime: ServiceLifetime.Transient)); } 这里,我们使用到了 IServiceCollection 里面的 Add 方法,添加一个生命周期为瞬态的 以上是默认微软为我们提供的添加依赖注入的方法,下面我们来看一下怎么来改造成我们需要的使用 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的对象, 注意:配置文件中的类型必须为全名称,即包含命名空间。 接下来,添加一个和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,在 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)); } } 然后我们测试一下是否是可用的。 测试 打开 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 – 角色提供程序是否按请求缓存?
- ASP.NET MVC模型绑定IList <>参数
- [你必须知道的.NET] 第六回:深入浅出关键字---base和this
- asp.net核心 – aspnetcidev和aspnetvnext之间的区别?
- asp.net-mvc-4 – 使用WebAPI进行搜索
- ASP.NET – 如何有效地使用设计模式而不需要过度工程!
- 如何将现有的ASP.NET网站转换为HTML 5
- asp-classic – 从头开始??在Visual Studio 2010中创建经典
- 在ASP.NET MVC中解码HTML 3
- ASP.NET Repeater ItemDataBound事件中等效的Eval(“field”
- ASP.NET Core 认证与授权[6]:授权策略是怎么执行
- asp.net – 304未修改静态文件
- asp.net – 使用Repeater控件构建动态链接
- asp.net-core – 从ActionFilterAttribute设置Vi
- asp.net-mvc – 使用MVC 5中的Entity Framework
- 使用Asp.NET标识进行LDAP身份验证
- asp.net – HTTP错误400 – 与Topshelf的OWIN
- asp.net-mvc – 使用cookie在ASP MVC中存储会话
- asp.net-mvc-4 – Azure上的PushSharp ASP.net M
- asp.net-mvc – 具有.NET MVC 5属性路由的贪婪段