(此文章同时发表在本人微信公众号“dotNET每日精华文章”,欢迎右边二维码来关注。)

题记:服务定位器(Service Locator)作为一种反模式,一般情况下应该避免使用,在ASP.NET Core更是需要如此。

Scott Allen在其博客网站上发表了一篇名为“Avoiding the Service Locator Pattern in ASP.NET Core”的文章解释了这一模式会带来的问题:导致应用程序无法完全基于控制反转(依赖注入)容器。同时给出了在各种情况下的替代方案。

虽然可以把ASP.NET Core中提供的HttpContext.ApplicationServices或HttpContext.ReqeustServices作为服务定位器使用(如下代码片段),但是应该避免这样使用。

var provider = HttpContext.ApplicationServices;
var someService = provider.GetService(typeof(ISomeService));

在启动的时候,注入自己的服务:

public class Startup
{public void ConfigureServices(IServiceCollection services) { }public void Configure(IApplicationBuilder app,IAmACustomService customService){// ....   }
}

在中间件中有两个地方可以注入服务(构造器和Invoke方法):

public class TestMiddleware
{public TestMiddleware(RequestDelegate next, IAmACustomService service){// ...}public async Task Invoke(HttpContext context, IAmACustomService service){// ...}
}

在控制器中可以在构造器中注入服务:

public class HelloController : Controller
{private readonly IAmACustomService _customService;public HelloController(IAmACustomService customService){_customService = customService;}public IActionResult Get(){// ...}
}

在控制器的操作方法中可以利用[FromServices]标记注入服务:

[HttpGet("[action]")]
public IActionResult Index([FromServices] IAmACustomService service)
{            // ...
}

在模型中同样可以利用[FromServices]:

public class TestModel
{       public string Name { get; set; }[FromServices]public IAmACustomService CustomService { get; set; }
}

在视图中可以利用@inject声明来注入服务:

@inject IAmACustomService CustomService;<div>Blarg
</div>

其实在所有其他地方甚至过滤器中都可以充分利用依赖注入,可以参考:Action Filters, Service Filters, and Type Filters(http://www.strathweb.com/2015/06/action-filters-service-filters-type-filters-asp-net-5-mvc-6/)。

避免在ASP.NET Core中使用服务定位器模式相关推荐

  1. 一图看懂 ASP.NET Core 中的服务生命周期

    翻译自 Waqas Anwar 2020年11月8日的文章 <ASP.NET Core Service Lifetimes (Infographic)> [1] ASP.NET Core ...

  2. ASP.NET Core中的依赖注入(4): 构造函数的选择与服务生命周期管理

    ServiceProvider最终提供的服务实例都是根据对应的ServiceDescriptor创建的,对于一个具体的ServiceDescriptor对象来说,如果它的ImplementationI ...

  3. 如何在 ASP.NET Core 中为 gRPC 服务添加全局异常处理 ?

    咨询区 Dmitriy 我在 ASP.NET Core 中使用 GRPC.ASPNETCore 工具包写 gRPC 服务,现在我想实现 gRPC 的异常全局拦截,我的代码如下: app.UseExce ...

  4. Api网关Kong集成Consul做服务发现及在Asp.Net Core中的使用

     1622219047536 写在前面   Api网关我们之前是用 .netcore写的 Ocelot的,使用后并没有完全达到我们的预期,花了些时间了解后觉得kong可能是个更合适的选择. 简单说下 ...

  5. 【半译】在ASP.NET Core中创建内部使用作用域服务的Quartz.NET宿主服务

    在我的上一篇文章<在ASP.NET Core中创建基于Quartz.NET托管服务轻松实现作业调度>,我展示了如何使用ASP.NET Core创建Quartz.NET托管服务并使用它来按计 ...

  6. ASP.NET Core中Ocelot的使用:基于服务发现的负载均衡

    本系列相关文章: <ASP.NET Core中Ocelot的使用:API网关的应用> <ASP.NET Core中Ocelot的使用:基于Spring Clound Netflix ...

  7. ASP.NET Core中为指定类添加WebApi服务功能

    POCO Controller是 ASP.NET Core 中的一个特性,虽然在2015年刚发布的时候就有这个特性了,可是大多数开发者都只是按原有的方式去写,而没有用到这个特性.其实,如果利用这个特性 ...

  8. 在ASP.NET Core中使用Apworks开发数据服务:对HAL的支持

    HAL,全称为Hypertext Application Language,它是一种简单的数据格式,它能以一种简单.统一的形式,在API中引入超链接特性,使得API的可发现性(discoverable ...

  9. 如何在ASP.Net Core中使用辅助服务

    ASP.Net Core 3.0 Preview 3添加了对创建工作程序服务的支持,这些工作程序是诸如Windows服务和Linux守护程序之类的后台服务. 还有一个用于在Visual Studio中 ...

最新文章

  1. 【leetcode】148. Sort List
  2. nagios二次开发(一)---开发思想
  3. 服务总线yali测试_满足吉利要求的车载总线测试服务
  4. centos7下安装mysql5.6_Linux-CentOS7下安装mysql5.6常见问题解决!
  5. 16个烧光你脑细胞的悖论
  6. android震动服务能设置时长么,Android实现手机振动设置的方法
  7. php 操作mysql 分表的一种方法
  8. 机器人学中的状态估计 中文版_《机器人学中的状态估计》-05偏差,匹配和外点...
  9. hdu 4790 Just Random (2013成都J题) 数学思路题 容斥
  10. 后台返回数据时,接口设计规范参考
  11. 数据预处理01_脏数据产生的原因
  12. Flutter 页面弹出毛玻璃浮层
  13. 【海码学院】web前端基础入门JavaScript之JavaScript起源和基础语法学习笔记
  14. Mysql索引类型 normal, unique, full text的区别
  15. 文档扫描OCR识别-2
  16. 像差分析(更新。。。)
  17. java 线性回归_多元线性回归----Java简单实现
  18. 水果店线上引流推广方案,水果店线上运营是做些什么
  19. Nboot与Eboot
  20. Gingko Framework:session的使用

热门文章

  1. win10系统日志显示不可用sid_win10系统电脑修改sid安全标识符的操作方法
  2. MySQL基础一些概念一些用法
  3. linux编译android源码,ubuntu16.04 Android源码下载编译
  4. fatfs 文件属性_FATFS文件系统剖析(全).
  5. 进行数据离散化的原因_数据离散化及其KMeans算法实现的理解
  6. selenium弹窗无法定位_Selenium异常集锦
  7. uc 开发 缓存css,使用css3 flex布局在手机uc浏览器中一塌糊涂?
  8. android实现双向绑定,Android使用DataBinding实现双向绑定(一)
  9. 李斌:中国量化投资踏上快速发展期
  10. python 3.6.3自带的编程调试环境包括了_序章:资料预处理(python3.6 可用fortran unformatted sequencial data读取模块)...