原文:Asp.Net Core 减少Controller获取重复注入对象

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u012770274/article/details/80876054

    在使用Asp.Net Core的时候我们都会用到依赖注入获取自定义的服务,如果是仓储的话可能还好,不同的controller需要用到不同的仓储,通过构造函数注入也算明确了业务关系。可是在使用到日志服务,缓存服务等工具类服务的时候往往会发现在大多数的controller中都要通过构造函数获取一遍注入服务,是件很麻烦的事。现在的想法是通过创建继承自Controller的BaseController类,在BaseController获取到所有的服务,之后其他controller再继承自BaseController获取到这些服务。下面来看下实现方式。

使用的是.net core 2.1。

在Startup的ConfigureServices添加HttpContextAccessor服务

services.AddHttpContextAccessor();

创建自定义的服务和接口

public interface IMyService
{
string GetGuId();
}
public class MyService : IMyService
{
private string guid = Guid.NewGuid().ToString(); public string GetGuId()
{
return guid;
}
}

在Startup的ConfigureServices中注册自定义服务

//services.AddSingleton<IMyService, MyService>();
//services.AddTransient<IMyService, MyService>();
services.AddScoped<IMyService, MyService>();

定义静态类ServiceLocator

public static class ServiceLocator
{
public static IServiceProvider Instance { get; set; }
}

在Startup的Configure为ServiceLocator.Instance赋值

ServiceLocator.Instance = app.ApplicationServices;

在BaseController的构造方法里通过ServiceLocator.Instance获取IHttpContextAccessor,再使用IHttpContextAccessor获取注册的自定义服务。这里不直接使用ServiceLocator.Instance.GetService方法获取自定义服务是,因为如果使用Scoped方式注册服务的话这里获取服务会报错。

public class BaseController : Controller
{
protected IMyService _myService;
public BaseController()
{
var hca = ServiceLocator.Instance.GetService<IHttpContextAccessor>();
_myService = hca.HttpContext.RequestServices.GetService<IMyService>();
}
}

让自定义的Controller继承自BaseController,通过BaseController获取自定义服务

public IActionResult GetGuId()
{
return Content(_myService.GetGuId());
}

这里特别感谢 田园里的蟋蟀 的《ASP.NET Core DI 手动获取注入对象》

Asp.Net Core 减少Controller获取重复注入对象的更多相关文章

  1. ASP.NET Core DI 手动获取注入对象

    ASP.NET Core DI 一般使用构造函数注入获取对象,比如在ConfigureServices配置注入后,通过下面方式获取: private IValueService _valueServi ...

  2. ASP.NET Core中如影随形的”依赖注入”[下]: 历数依赖注入的N种玩法

    在对ASP.NET Core管道中关于依赖注入的两个核心对象(ServiceCollection和ServiceProvider)有了足够的认识之后,我们将关注的目光转移到编程层面.在ASP.NET ...

  3. [ASP.NET Core 3框架揭秘] 依赖注入[3]:依赖注入模式

    IoC主要体现了这样一种设计思想:通过将一组通用流程的控制权从应用转移到框架之中以实现对流程的复用,并按照"好莱坞法则"实现应用程序的代码与框架之间的交互.我们可以采用若干设计模式 ...

  4. [ASP.NET Core 3框架揭秘] 依赖注入[2]:IoC模式

    正如我们在<依赖注入:控制反转>提到过的,很多人将IoC理解为一种"面向对象的设计模式",实际上IoC不仅与面向对象没有必然的联系,它自身甚至算不上是一种设计模式.一般 ...

  5. [ASP.NET Core 3框架揭秘] 依赖注入:依赖注入模式

    原文:[ASP.NET Core 3框架揭秘] 依赖注入:依赖注入模式 IoC主要体现了这样一种设计思想:通过将一组通用流程的控制权从应用转移到框架之中以实现对流程的复用,并按照“好莱坞法则”实现应用 ...

  6. [ASP.NET Core 3框架揭秘] 依赖注入:IoC模式

    原文:[ASP.NET Core 3框架揭秘] 依赖注入:IoC模式 正如我们在<依赖注入:控制反转>提到过的,很多人将IoC理解为一种“面向对象的设计模式”,实际上IoC不仅与面向对象没 ...

  7. [ASP.NET Core 3框架揭秘] 依赖注入:控制反转

    ASP.NET Core框架建立在一些核心的基础框架之上,这些基础框架包括依赖注入.文件系统.配置选项和诊断日志等.这些框架不仅仅是支撑ASP.NET Core框架的基础,我们在进行应用开发的时候同样 ...

  8. [ASP.NET Core 3框架揭秘] 依赖注入[5]: 利用容器提供服务

    毫不夸张地说,整个ASP.NET Core框架是建立在依赖注入框架之上的.ASP.NET Core应用在启动时构建管道以及利用该管道处理每个请求过程中使用到的服务对象均来源于依赖注入容器.该依赖注入容 ...

  9. [ASP.NET Core 3框架揭秘] 依赖注入[4]:一个Mini版的依赖注入框架

    在前面的章节中,我们从纯理论的角度对依赖注入进行了深入论述,我们接下来会对.NET Core依赖注入框架进行单独介绍.为了让读者朋友能够更好地理解.NET Core依赖注入框架的设计与实现,我们按照类 ...

随机推荐

  1. MyBatis-Generator 用法介绍

    ”工欲善其事,必先利其器“,古人说的很对,虽然不能做一个单纯的”工具帝“,但是自己有合适的工具集真的很关键.以前认识一个做逆向工程的高手,有自己的”反马套装“,其实不外乎就是 OD . IDA .Sy ...

  2. 【前端知识体系-JS相关】组件化和React

    1. 说一下使用jQuery和使用框架的区别? 数据和视图的分离,(jQuery数据和视图混在一起,代码耦合)-------开放封闭原则 以数据驱动视图(只关注数据变化,DOM操作被封装) 2.说一下 ...

  3. JavaScript(这里主要侧重于 JavaScript HTML DOM)杂项

    JavaScript基础 ------学习网站https://www.runoob.com/js/js-tutorial.html Javascript语言的特点: 安全性:2.易用性:3.动态交互性 ...

  4. 阿里开源 KT Connnect,轻量级云原生测试环境治理平台来啦!

    作者| 阿里云技术专家 郑云龙(砧木) 目前越来越多的开发者开始采纳 Kubernetes 管理基础设施环境,并通过 Kubernetes 完成日常的开发,测试以及生产发布活动,为了能够有效的帮助开发 ...

  5. Java基础扫盲系列(三)— Java内省技术

    前言 Java内省技术属于Java基础体系的的一部分,但是很多人都不甚了解.笔者也是在学习Spring源码的过程中遇到该技术模块的.为了完善技术体系,本文将全面的学习该技术.在提到Java内省技术,就 ...

  6. 【01】Nginx:编译安装/动态添加模块

    写在前面的话 说起 Nginx,别说运维,就是很多开发人员也很熟悉,毕竟如今已经 2019 年了,Apache 更多的要么成为了历史,要么成为了历史残留. 我们在提及 Nginx 的时候,一直在强调他 ...

  7. Python - 数字 - 第六天

    Python 数字(Number) Python 数字数据类型用于存储数值. 数据类型是不允许改变的,这就意味着如果改变数字数据类型的值,将重新分配内存空间. 以下实例在变量赋值时 Number 对象 ...

  8. JAVA性能监控与调优参考文档链接

    JAVA性能监控与调优参考文档链接 jdk8工具集 https://docs.oracle.com/javase/8/docs/technotes/tools/unix/index.htmlTroub ...

  9. tomcat特殊字符处理问题解决方案

    tomcat特殊字符处理问题解决方案 直接加上如下代码,本质是通过反射加上过滤字符 @Configuration public class TomcatConfig { @Bean public Co ...

  10. Qt发送邮件

    首先下载支持库 https://download.csdn.net/download/zhangxuechao_/10598108 #ifndef MAIL_H #define MAIL_H #inc ...