一般想从容器中获取对象,我们都是通过构造方法获取对象,但有些条件不允许不能通过构造方法获取对象,我们必须单独从容器中单独创建获取找个对象,这样我们就不行把找个容器静态保存起来供全局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. [TCP/IP] TCP的报文头

    1.源端口和目的端口:各占2个字节,分别写入源端口和目的端口: 2.序列号:占4个字节,TCP连接中传送的字节流中的每个字节都按顺序编号.例如,一段报文的序号字段值是 301 ,而携带的数据共有100 ...

  2. FollowUp CRM是什么,有什么作用,好不好

    FollowUp,基于Gmail的私人CRM: 是一款Chrome插件,构建在Gmail邮箱服务之上: FollowUp支持通过Gmail:设置提醒,编写备注,计划会议,查看下一步的内容等: Foll ...

  3. 201871010136—赵艳强《面向对象程序设计(java)》第十三周学习总结

    201871010136—赵艳强<面向对象程序设计(java)>第十三周学习总结   博文正文开头格式:(2分) 项目 内容 <面向对象程序设计(java)> https:// ...

  4. 算法竞赛入门经典 LA 4329(树状数组)

    题意: 一排有着不同能力值的人比赛,规定裁判的序号只能在两人之间,而且技能值也只能在两人之间 问题: <算法竞赛入门经典-训练指南>的分析: 上代码: #include<iostre ...

  5. halcon笔记1

    * 获得二值图 Image_binread_image(Image, 'C:/Alex/halcon/test.bmp') // 读图 threshold (Image, Regions, , ) / ...

  6. 创建maven父子项目(九)

    一.父子-聚合项目 通过 maven 可以创建父子-聚合项目. 所谓的父子项目,即有一个父项目,有多个子项目.这些子项目,在业务逻辑上,都归纳在这个父项目下,并且一般来说,都会有重复的jar包共享.所 ...

  7. day45 作业

    一.将当前日期按"2017-12-27 11:11 星期三"格式输出 function getdate(){ var d = new Date(); year = d.getFul ...

  8. TVM:

    Hello TVM  发表于 2019-06-29 TVM 是什么?A compiler stack,graph level / operator level optimization,目的是(不同框 ...

  9. icon发展史速览

    icon 发展史 img 多张图片占用多个请求,想办法减少请求,合并图片,image sprite background-position /* 使用background-position来定位图标 ...

  10. 计时任务之StopWatch

    StopWatch对应的中文名称为秒表,经常我们对一段代码耗时检测的代码如下: long startTime = System.currentTimeMillis(); // 业务处理代码 doSom ...