zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    cogs 826. Feb11] GF打dota
    cogs 133. [USACO Mar08] 牛跑步 A*k短路算法
    luogu cogs 1437. [NOIP2013]转圈游戏
    RESTful
    中间件
    回顾基础知识,类,fbv,cbv
    Vue
    ES6的一些说明
    小试牛刀2
    小试牛刀
  • 原文地址:https://www.cnblogs.com/lxshwyan/p/10893418.html
Copyright © 2011-2022 走看看