一般想从容器中获取对象,我们都是通过构造方法获取对象,但有些条件不允许不能通过构造方法获取对象,我们必须单独从容器中单独创建获取找个对象,这样我们就不行把找个容器静态保存起来供全局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. Django 中使用 js 操作 cookies

    session与cookie对比 Cookie: 保存在用户浏览器端的键值对 本地可以修改:如果有敏感信息,可以被看到 Session: 保存在服务器端的键值对 服务端:保存键值对{'随机字符串':{ ...

  2. ASIO库使用注意事项

    1. 使用 io_service::work 实现 io_service 无任务时不退出 正常情况下向io_service抛任务,它执行完成后就会自动退出,而要实现那种chromium那种的循环队列, ...

  3. 简单python爬虫实例

    先放上url,https://music.douban.com/chart 这是豆瓣的一个音乐排行榜,这里爬取了左边部分的歌曲排行榜部分,爬虫很简单,就用到了beautifulsoup和request ...

  4. Linux学习笔记-第2天- 新的开始

    迟到且稀疏的笔记,希望自己今年会有所突破.加油

  5. [BJOI2019]光线(DP)

    降智了…… 当你走头无路的时候就应该知道瞎搞一个DP: $p[i]$ 表示光射入第 $1$ 块玻璃时,从第 $i$ 块玻璃出去的光量. $q[i]$ 表示光射入第 $i$ 块玻璃时,从第 $i$ 块玻 ...

  6. MySQL实战45讲学习笔记:第十三讲

    一.引子 经常会有同学来问我,我的数据库占用空间太大,我把一个最大的表删掉了一半的数据,怎么表文件的大小还是没变? 那么今天,我就和你聊聊数据库表的空间回收,看看如何解决这个问题. 这里,我们还是针对 ...

  7. Web协议详解与抓包实战:HTTP1协议-请求与响应的上下文(7)

    一.请求的上下文: User-Agent 指明客户端的类型信息,服务器可以据此对资源的表述做抉择 二.请求的上下文: Referer 浏览器对来自某一页面的请求自动添加的头部 截图2 这对于我们的防盗 ...

  8. ADB/Fastboot刷机

    谷歌官方ADB/Fastboot等工具包下载地址(最新版/免.墙):WINDOWS :https://dl.google.com/android/repository/platform-tools-l ...

  9. [勘误] Head First Java (2nd edition)中文版勘误

    附上英文原版高清pdf:链接: https://pan.baidu.com/s/1X5Aikj6krROnp3oXuTVl8Q 提取码: f6xd 标注本文: 上面的图是中文译本中的错误 下面的图是英 ...

  10. 搭建Jena Fuseki并执行SPARQL查询

    1. 下载Jena Fuseki:http://jena.apache.org/download/index.cgi 2. 运行服务 windows解压后双击fuseki-server.bat lin ...