原文: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. vuex 源码分析(六) 辅助函数 详解

    对于state.getter.mutation.action来说,如果每次使用的时候都用this.$store.state.this.$store.getter等引用,会比较麻烦,代码也重复和冗余,我 ...

  2. linq 大数据 sql 查询及分页优化

    前提: 需要nuget   PredicateLib   0.0.5: SqlServer  2008R2 (建议安装 64 位): .net 4.5 或以上: 当前电脑配置: I7 4核  3.6G ...

  3. Docker学习(六)-Kubernetes - Spring Boot 应用

    接上一篇 https://www.cnblogs.com/woxpp/p/11872155.html 新建 k8s-demo.yaml apiVersion: apps/v1beta2 kind: D ...

  4. Express 框架以及与http-proxy-middleware整合实现代理

    1.Express的简单使用 1.简介 Express 是一个简洁而灵活的 node.js Web应用框架, 提供了一系列强大特性帮助你创建各种 Web 应用,和丰富的 HTTP 工具. 使用 Exp ...

  5. jre、jdk、jvm之间的关系

    很多Java的程序员在写了很多代码之后,你问他JRE和JDK是是什么关系,JVM又是什么东西,他是不知道的. JVM(Java Virtual Machine) Java 虚拟机.它只认识 xxx.c ...

  6. IDEA帮助文档快捷键ctrl+q 查看类 方法 变量 帮助文档 注释 快捷键

    IDEA查看类 成员变量  局部变量注释快捷键,Ctrl +Q 查看帮助文档 实际项目中,通常一个类中的代码都不少,而且有很多的变量 那么如何快速知道这个变量的一些信息,比如类型,定义? 比如在第50 ...

  7. Navicat Premium 12.0.22 安装与破解

    一.安装 Navicat Premium 12.0.22的下载链接:https://pan.baidu.com/s/1swRY_fwIZfufdxDZj3hDyw 密码:09k8 安装步骤就是一路向下 ...

  8. 如何配置Memcached高速缓存,加快wordpress的速度

    Memcached是什么 Memcached是一种高性能的分布式内存对象缓存系统.在动态应用,Memcached既能提高访问的速度,同时还减低了数据库的负载.DangaInteractive为提升Li ...

  9. F#周报2019年第18期

    新闻 FableConf 2019开始征集提案 2019理事会选举 如同DSL一般的Elmish封装器fable-elmish,可以创建控制台或者终端界面 介绍VS Code的远程开发 F#(.NET ...

  10. linux内核级同步机制--futex

    在面试中关于多线程同步,你必须要思考的问题 一文中,我们知道glibc的pthread_cond_timedwait底层是用linux futex机制实现的. 理想的同步机制应该是没有锁冲突时在用户态 ...