一般想从容器中获取对象,我们都是通过构造方法获取对象,但有些条件不允许不能通过构造方法获取对象,我们必须单独从容器中单独创建获取找个对象,这样我们就不行把找个容器静态保存起来供全局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. Mybatis使用Mybatis-generator插件及配置(数据库逆向工程)

    Mybatis使用Mybatis-generator插件 首先在POM.xml文件添加架包,我这里用的是SpringBoot,所以用的也是SpringBoot架包,最少要mybatis,generat ...

  2. HTTPS中的加密验证部分理论

    为了加深自己对于https加密这一块的映象,决定写出来试试 就是在http层下面加了一个ssl层, 服务器将自己的公钥发送给证书机构,申请证书,证书机构首先会验证个服务器是否合法,线上或者线下,然后用 ...

  3. JAVAWEB复习-JS

    1.概述 JavaScript是基于对象和事件的脚本语言,主要应用在客户端 特点:信息动态交互,不可直接访问本地磁盘,只要是可以解析js的浏览器都可以跨平台执行 2.JS和JAVA比较 a:JS是面向 ...

  4. 如何下载windows版的kubectl.exe文件

    github上的下载链接,不能直接下载. https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG-1.14.md#client-b ...

  5. 简单C语言程序

    #include<stdio.h> int main(void) { /* 计算两个时间的时间差 */ int hour1, minute1; int hour2, minute2; pr ...

  6. 201871010124--王生涛--《面向对象程序设计(java)》第十二周学习总结

    博文正文开头格式: 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.com/nw ...

  7. 201871010133-赵永军《面向对象程序设计(java)》第十五周学习总结

    201871010133-赵永军<面向对象程序设计(java)>第十五周学习总结 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ ...

  8. 面向对象程序设计(Java) 第4周学习指导及要求

    2019面向对象程序设计(Java)第4周学习指导及要求(2019.9.17-2019.9. 23)  学习目标 掌握类与对象的基础概念,理解类与对象的关系: 掌握对象与对象变量的关系: 掌握预定义类 ...

  9. Docker常用安装(九)

    一.安装mysql 1.  docker hub上面查找mysql镜像 2. 拉取镜像 #获取mysql镜像 docker pull mysql:5.6 3. 运行容器 docker run -p 1 ...

  10. zzDeep Learning Papers Translation(CV)

    Deep Learning Papers Translation(CV) Image Classification AlexNetImageNet Classification with Deep C ...