一般想从容器中获取对象,我们都是通过构造方法获取对象,但有些条件不允许不能通过构造方法获取对象,我们必须单独从容器中单独创建获取找个对象,这样我们就不行把找个容器静态保存起来供全局diaoy

一、 简单些一下步骤如下:(从某一个大神视频或者代码中学习到的,具体哪个不记得了)

1.先做一个构建对象的接口IEngine

 public interface IEngine
{
/// <summary>
/// 构建一个实例
/// </summary>
/// <typeparam name="T"></typeparam>
/// <returns></returns>
T Resolve<T>() where T : class;
/// <summary>
/// 构建类型
/// </summary>
/// <param name="type"></param>
/// <returns></returns>
object Resolve(Type type);
}

2.再构建一个引擎对象实现 IEngine接口

 public class GeneralEngine : IEngine
{
private IServiceProvider _serviceProvider;
public GeneralEngine(IServiceProvider serviceProvider)
{
this._serviceProvider = serviceProvider;
} /// <summary>
/// 构建实例
/// </summary>
/// <typeparam name="T"></typeparam>
/// <returns></returns>
public T Resolve<T>() where T : class
{
return _serviceProvider.GetService<T>();
}
/// <summary>
/// 构建类型
/// </summary>
/// <param name="type"></param>
/// <returns></returns>
public object Resolve(Type type)
{
return _serviceProvider.GetService(type);
}
}  

3.再创建一个保存容器的对象EnginContext

 public class EnginContext
{
private static IEngine _engine; /// <summary>
///
/// </summary>
/// <param name="engine"></param>
/// <returns></returns>
[MethodImpl(MethodImplOptions.Synchronized)] //多线程同时只能访问一次
public static IEngine Initialize(IEngine engine)
{
if (_engine == null)
_engine = engine;
return _engine;
} /// <summary>
/// 当前引擎
/// </summary>
public static IEngine Current
{
get
{
return _engine;
}
}
}

4. 在Startup类ConfigureServices方法中加入

   EnginContext.Initialize(new GeneralEngine(services.BuildServiceProvider()));

5.使用如下  ,不需要通过构造方法获取对象了

ILogger logger = EnginContext.Current.Resolve<ILogger<BaseController>>();

二、Nlog的作用和写法我就不具体描述了,接下来主要说一下用这种方法获取不到Nlog对象

当通过 EnginContext.Initialize(new GeneralEngine(services.BuildServiceProvider()));这种方法生成引擎的时候

    private ILogger<ValuesController> _logger;
private ILogger<ValuesController> _GeneralEnginelogger;
public ValuesController(ILogger<ValuesController> logger)
{
_logger = logger;
_logger.LogInformation("构造方法获取的对象日志");
_GeneralEnginelogger = EnginContext.Current.Resolve<ILogger<ValuesController>>();
_GeneralEnginelogger.LogInformation("EnginContext方法获取的对象日志");
}

运行后 界面日志如下:

并没有发现[EnginContext方法获取的对象日志]  但仔细观察控制台界面是有信息的产生的

以上说明并没有获取nlog日志对象,只是获取到asp net core 自带的日志对象,调试可以验证,

刚开始发现这个文件感觉比较莫名其妙,通过构造方法可以获取nlog对象,为什么通过引擎   services.BuildServiceProvider().GetService<>这个方法获取不了对象呢;

最后发现在IApplicationBuilder对象有一个ApplicationServices属性它的GetRequiredService也可以获取对象,将上述引擎改到Configure类中这样就可以了

EnginContext.Initialize(new GeneralEngine(services.BuildServiceProvider()));改成如下
                                    EnginContext.Initialize(new GeneralEngine(app.ApplicationServices));

运行截图如下:

 代码如下:https://github.com/lxshwyan/QuartzDemo.git

asp.net core不通过构造方法从容器中获取对象及解决通过这种方法NLog获取对象失败的问题的更多相关文章

  1. ASP.NET Core中使用IOC三部曲(一.使用ASP.NET Core自带的IOC容器)

    前言 本文主要是详解一下在ASP.NET Core中,自带的IOC容器相关的使用方式和注入类型的生命周期. 这里就不详细的赘述IOC是什么 以及DI是什么了.. emm..不懂的可以自行百度. 目录 ...

  2. ASP.NET Core Web 应用程序系列(一)- 使用ASP.NET Core内置的IoC容器DI进行批量依赖注入(MVC当中应用)

    在正式进入主题之前我们来看下几个概念: 一.依赖倒置 依赖倒置是编程五大原则之一,即: 1.上层模块不应该依赖于下层模块,它们共同依赖于一个抽象. 2.抽象不能依赖于具体,具体依赖于抽象. 其中上层就 ...

  3. ASP.NET Core使用Docker-Compose实现多容器应用部署

    一.需求背景 人生苦短,我用.NET Core!前面的<ASP.NET Core使用Docker进行容器化托管和部署>基础课程我们学习了如何使用Docker来部署搭建ASP.NET Cor ...

  4. .Net Core 3.0 的 docker 容器中运行 无法 访问 Oracle数据库

    .Net  Core 3.0 的 docker 容器中运行 无法 访问 Oracle数据库  , 一直报下面的错误 ORA-00604: error occurred at recursive SQL ...

  5. ASP.NET Core依赖注入系统学习教程:关于服务注册使用到的方法

    在.NET Core的依赖注入框架中,服务注册的信息将会被封装成ServiceDescriptor对象,而这些对象都会存储在IServiceCollection接口类型表示的集合中,另外,IServi ...

  6. Gitlab CI 自动部署 asp.net core web api 到Docker容器

    为什么要写这个? 在一个系统长大的过程中会经历不断重构升级来满足商业的需求,而一个严谨的商业系统需要高效.稳定.可扩展,有时候还不得不考虑成本的问题.我希望能找到比较完整的开源解决方案来解决持续集成. ...

  7. ASP.NET Core 借助 K8S 玩转容器编排

    Production-Grade Container Orchestration - Automated container deployment, scaling, and management. ...

  8. ASP.NET Core 实战:使用 Docker 容器化部署 ASP.NET Core + MySQL + Nginx

    一.前言 在之前的文章(ASP.NET Core 实战:Linux 小白的 .NET Core 部署之路)中,我介绍了如何在 Linux 环境中安装 .NET Core SDK / .NET Core ...

  9. Asp.Net Core&Docker部署到树莓派3B中

    花了一点时间将吃灰数月的树莓派装上了Docker,并在容器中部署了一个Asp.Net Core应用程序,通过花生壳映射树莓派中的程序,可以使用外网访问树莓派,玩起来很有意思(外网访问地址:http:/ ...

随机推荐

  1. Prometheus node_exporter grafana部署安装

    1.环境 centos7 prometheus-2.10.0.linux-amd64.tar.gz node_exporter-0.18.1.linux-amd64.tar.gz 2.安装 创建sys ...

  2. 构建Apache Web服务器

    Apache 是世界使用排名第一的 Web 服务器软件.它可以运行在几乎所有广泛使用的计算机平台上,由于其跨平台和安全性被广泛使用,是最流行的 Web 服务器端软件之一.Apache工作模式有多种,其 ...

  3. AWS之EC2搭建WordPress博客

    AWS之搭建WordPress博客 注意:请确定您已经成功完成LAMP架构的搭建; 1.下载并解压WordPress安装包: ①使用wget命令在WordPress官网获取最新安装包: [ec2-us ...

  4. 源码详解Pytorch的state_dict和load_state_dict

    在 Pytorch 中一种模型保存和加载的方式如下: # save torch.save(model.state_dict(), PATH) # load model = MyModel(*args, ...

  5. 继承c3,网络编程,相互通信

    继承: 面向对象多继承,a先找左,再找右 py2中有经典类,新式类,py3中只有新式类 py2中用ascii 编译 py3中用unicode 编译 py2: 经典类 新式类:如果自己或自己的前辈继承o ...

  6. TensorFlow语法点滴

    1. tf.variable_scope生成一个上下文管理器,用于获取已经生成的变量 with tf.variable_scope('pnet'): data = tf.placeholder(tf. ...

  7. SpringBoot整合FastDFS实现图片的上传

     文件的上传和预览在web开发领域是随处可见,存储的方式有很多,本文采用阿里巴巴余庆大神开发的FastDFS进行文件的存储,FastDFS是一个分布式文件存储系统,可以看我上一篇博文,有安装和配置教程 ...

  8. 原生js-input框全选

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. 洛谷 P1919 A*B Problem升级版

    妈妈我终于会\(A*B\ problem\)啦~~ 题目大意: 给你两个正整数 \(a,b\),求\(a*b\) 其中\(a,b\le 10^{1000000}\) 我们只要把多项式\(A(x)=\s ...

  10. PATA1075 PAT Judge (25 分)

    The ranklist of PAT is generated from the status list, which shows the scores of the submissions. Th ...