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

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

原文地址:https://www.cnblogs.com/lxshwyan/p/10893418.html

时间: 2024-09-29 05:02:28

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

ASP.NET Core 如何在运行Docker容器时指定容器外部端口(docker compose)

原文:ASP.NET Core 如何在运行Docker容器时指定容器外部端口(docker compose) 前面我写了一系列关于持续集成的文章,最终构建出来的镜像运行之后,应该会发现每次构建运行之后端口都变了,这对于我们来说是十分不方便的,所以我们可以通过修改docker compose的配置文件来完成我们的需求. 熟悉Docker的都应该知道容器运行时其内部会有一个端口以映射到我们外部的端口,我们需要固定的就是这个外部端口. 打开 docker-compose.override.yml 文件

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

原文:ASP.NET Core 借助 K8S 玩转容器编排 Production-Grade Container Orchestration - Automated container deployment, scaling, and management. 生产级别的容器编排系统--自动化的容器部署.扩展和管理. 1. 引言 由于最近在学习微服务,所以就基于之前docker的基础上把玩一下k8s(Kubernetes),以了解基本概念和核心功能. 2. What's k8s? k8s涉及到很多

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

在正式进入主题之前我们来看下几个概念: 一.依赖倒置 依赖倒置是编程五大原则之一,即: 1.上层模块不应该依赖于下层模块,它们共同依赖于一个抽象. 2.抽象不能依赖于具体,具体依赖于抽象. 其中上层就是指使用者,下层就是指被使用者. 二.IoC控制反转 控制反转(IoC,全称Inversion of Control)是一种思想,所谓“控制反转”,就是反转获得依赖对象的过程. 三.依赖注入(DI) 依赖注入设计模式是一种在类及其依赖对象之间实现控制反转(IoC)思想的技术. 所谓依赖注入(DI,全

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

为什么要写这个? 在一个系统长大的过程中会经历不断重构升级来满足商业的需求,而一个严谨的商业系统需要高效.稳定.可扩展,有时候还不得不考虑成本的问题.我希望能找到比较完整的开源解决方案来解决持续集成.监控报警.以及扩容和高可用性的问题.是学习和探索的过程分享给大家,也欢迎同行的人交流. 先来一个三步曲,我们将完成通过GitLab CI 自动部署 net core web api 到Docker 容器的一个示例.这是第一步,通过此文您将了解如何将net core web api 运行在Docker

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

一.需求背景 人生苦短,我用.NET Core!前面的<ASP.NET Core使用Docker进行容器化托管和部署>基础课程我们学习了如何使用Docker来部署搭建ASP.NET Core + Mysql容器化应用程序环境.对于需要多个容器(比如需要Nginx.SqlServer.Redis.RabbitMQ等)协调运行的复杂应用中,使用逐个单个运行容器的方式进行部署时,很显然会很麻烦,而且还要为各个容器之间的网络连接而苦恼.还好,Docker体贴的为我们想到了这一点.借助Compose模块

Asp.Net Core WebAPI+PostgreSQL部署在Docker中

 PostgreSQL是一个功能强大的开源数据库系统.它支持了大多数的SQL:2008标准的数据类型,包括整型.数值值.布尔型.字节型.字符型.日期型.时间间隔型和时间型,它也支持存储二进制的大对像,包括图片.声音和视频.PostgreSQL对很多高级开发语言有原生的编程接口,如C/C++.Java..Net.Perl.Python.Ruby.Tcl 和ODBC以及其他语言等,也包含各种文档.我用PostgreSQL结合.Net Core WebAPI构建并部署在Docker中做了一个Demo构

【Asp.Net Core】在Visual Studio 2017中使用Asp.Net Core构建Angular4应用程序

前言 Visual Studio 2017已经发布了很久了.做为集成了Asp.Net Core 1.1的地表最强IDE工具,越来越受.NET系的开发人员追捧. 随着Google Angular4的发布.我一直在想,怎么能够用这个地表最强IDE工具编写Angular4的Asp.Net Core项目.经过不懈的研究.终于的得到了一套很好的解决方案与大家分享. 文章转载请著名出处:http://www.cnblogs.com/smallprogram 我们的目的 随着Web技术的快速发展,新的技术层出

【ASP.NET Core】如何隐藏响应头中的 “Kestrel”

全宇宙人民都知道,ASP.NET Core 应用是不依赖服务器组件的,因此它可以独立运行,一般是使用支持跨平台的 Kestrel 服务器(当然,在 Windows 上还可以考虑用 HttpSys,但要以管理员身份运行). 尽管 SDK 文档中推荐我们用服务器组件来“反向”代理,但独立运行也是允许的.当 Web 应用独立运行的时候,客户端发出请求后,在响应的 HTTP 消息中,会附上一个 Server 头,其值就是 Kestrel.如下面的高清无码无水印截图所示. 看到了吧,Server = Ke

ASP.NET Core框架揭秘(持续更新中…)

之前写了一系列关于.NET Core/ASP.NET Core的文章,但是大都是针对RC版本.到了正式的RTM,很多地方都发生了改变,所以我会将之前发布的文章针对正式版本的.NET Core 1.0进行改写.除此之外,我还会撰写一系列与此相关的文章,这些文章以ASP.NET Core为核心,我个人将它们分成三个主要的部分,即编程基础.支撑框架和管道详解.其中编程基础主要涉及与ASP.NET Core独特的编程模型和相关编程技巧.支撑框架则介绍支撑ASP.NET Core的多个独立的框架,比如依赖