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

题记:服务定位器(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/)。

原文发布于微信公众号 - 我为Net狂(dotNetCrazy)

原文发表时间:2016-02-24

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏NetCore

【翻译】在Visual Studio中使用Asp.Net Core MVC创建你的第一个Web API应用(一)

HTTP is not just for serving up web pages. It’s also a powerful platform for bui...

2555
来自专栏圣杰的专栏

ABP入门系列(16)——通过webapi与系统进行交互

源码路径:Github-LearningMpaAbp 1. 引言 上一节我们讲解了如何创建微信公众号模块,这一节我们就继续跟进,来讲一讲公众号模块如何与系统...

1.6K6
来自专栏me的随笔

ASP.NET MVC5请求管道和生命周期

请求管道是一些用于处理HTTP请求的模块组合,在ASP.NET中,请求管道有两个核心组件:IHttpModule和IHttpHandler。所有的HTTP请求都...

1433
来自专栏恰童鞋骚年

.NET Core微服务之基于MassTransit实现数据最终一致性(Part 1)

  关于数据一致性的文章,园子里已经有很多了,如果你还不了解,那么可以通过以下的几篇文章去快速地了解了解,有个感性认识即可。

1395
来自专栏码农阿宇

EF Core利用Transaction对数据进行回滚保护

What? 首先,说一下什么是EF Core中的Transaction Transaction允许以原子方式处理多个数据库操作,如果事务已提交,则所有操作都应用...

3705
来自专栏张善友的专栏

当调用GetAuthorizationGroups() 的错误-“试图访问卸载的应用程序域“(Exception from HRESULT: 0x80131014)解决方案

针对 Windows® 平台,Microsoft 提供了三个主要目录平台:Active Directory® 域服务、每台 Windows 计算机上的本地安全帐...

2217
来自专栏石奈子的Java之路

原 荐 Java9之HttpClientAP

2682
来自专栏dotnet & java

WCF 入门 (21)

其实不太了解为什么第21集才讲这个Binding,下面都是一些概念性的东西,不过作为一个入门视频,了解一下也无妨吧。

925
来自专栏木宛城主

ASP.NET MVC 随想录——探索ASP.NET Identity 身份验证和基于角色的授权,中级篇

在前一篇文章中,我介绍了ASP.NET Identity 基本API的运用并创建了若干用户账号。那么在本篇文章中,我将继续ASP.NET Identity 之...

4386
来自专栏我和未来有约会

Silverlight本地化

ilverlight本地化 简单的实现多语言版本的Silverlight应用。 日益国际化的同时,需要我们开发的应用根据不同的来访者显示不用的语言,Silv...

18510

扫码关注云+社区

领取腾讯云代金券