博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
asp.net core不通过构造方法从容器中获取对象及解决通过这种方法NLog获取对象失败的问题...
阅读量:7225 次
发布时间:2019-06-29

本文共 3070 字,大约阅读时间需要 10 分钟。

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

     一、 简单些一下步骤如下:(从某一个大神视频或者代码中学习到的,具体哪个不记得了)

      1.先做一个构建对象的接口IEngine

public interface IEngine    {        ///         /// 构建一个实例        ///         /// 
///
T Resolve
() where T : class; ///
/// 构建类型 /// ///
///
object Resolve(Type type); }

2.再构建一个引擎对象实现 IEngine接口

public class GeneralEngine : IEngine    {        private IServiceProvider _serviceProvider;            public GeneralEngine(IServiceProvider serviceProvider)        {            this._serviceProvider = serviceProvider;        }        ///         /// 构建实例        ///         /// 
///
public T Resolve
() where T : class { return _serviceProvider.GetService
(); } ///
/// 构建类型 /// ///
///
public object Resolve(Type type) { return _serviceProvider.GetService(type); } }  

3.再创建一个保存容器的对象EnginContext

public class EnginContext    {        private static IEngine _engine;        ///         ///         ///         ///         /// 
[MethodImpl(MethodImplOptions.Synchronized)] //多线程同时只能访问一次 public static IEngine Initialize(IEngine engine) { if (_engine == null) _engine = engine; return _engine; } /// /// 当前引擎 /// public static IEngine Current { get { return _engine; } } }

4. 在Startup类ConfigureServices方法中加入

EnginContext.Initialize(new GeneralEngine(services.BuildServiceProvider()));

5.使用如下  ,不需要通过构造方法获取对象了 

ILogger logger = EnginContext.Current.Resolve
>();

 二、Nlog的作用和写法我就不具体描述了,接下来主要说一下用这种方法获取不到Nlog对象

      当通过 EnginContext.Initialize(new GeneralEngine(services.BuildServiceProvider()));这种方法生成引擎的时候

    

private ILogger
_logger; private ILogger
_GeneralEnginelogger; public ValuesController(ILogger
logger) { _logger = logger; _logger.LogInformation("构造方法获取的对象日志"); _GeneralEnginelogger = EnginContext.Current.Resolve
>(); _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

你可能感兴趣的文章
Chronon 3.5 发布,支持 Java 7
查看>>
操作系统同步原语
查看>>
一 flask介绍 三
查看>>
C++拓展笔记1-3:浅析C++关键字const的几个作用
查看>>
Django 分页组件替换自定义分页
查看>>
Pdf Convert Image 的解决方案
查看>>
[笔记]使用clearfix清除浮动
查看>>
数据强转
查看>>
Latest crack software ftp download
查看>>
OpenStack 的防火墙规则流程
查看>>
Overloading Django Form Fields
查看>>
03.MyBatis的核心配置文件SqlMapConfig.xml
查看>>
python学习笔记(9)-python编程风格
查看>>
Apache HTTP Server搭建虚拟主机
查看>>
(译).NET4.X 并行任务中Task.Start()的FAQ
查看>>
git log显示
查看>>
java中相同名字不同返回类型的方法
查看>>
Rails NameError uninitialized constant class solution
查看>>
Android 获取SDCard中某个目录下图片
查看>>
设置cookies第二天0点过期
查看>>