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
- asp.net中SqlDataReader获取数据存在的问题解决方法
- 通过machineKey配置解决asp.net验证视图状态MAC失败的问题
- 解决asp.net mvc UpdateModel更新对象后出现null问题的方法
- ASP.NET Core2.0 使用VSCode 版本1.13.1工具 开发控制台运行出现中文乱码问题及解决方法
- asp.net(C#)通过WMI无法获取磁盘卷序列号(硬件信息)的问题解决办
- ASP.NET多个用户控件回车提交表单问题解决和获取用户控件上的ID方法
- ASP.NET Core 2.0 带初始参数的中间件问题及解决方法
- 轻松解决asp.net用户ASPNET登录失败问题的方法分享
- 常量,字段,构造方法 调试 ms 源代码 一个C#二维码图片识别的Demo 近期ASP.NET问题汇总及对应的解决办法 c# chart控件柱状图,改变柱子宽度 使用C#创建Windows服务 C#服务端判断客户端socket是否已断开的方法 线程 线程池 Task .NET 单元测试的利剑——模拟框架Moq
- asp.net无法获取iis目录的问题解决方法
- C#中??和?分别是什么意思? 在ASP.NET开发中一些单词的标准缩写 C#SESSION丢失问题的解决办法 在C#中INTERFACE与ABSTRACT CLASS的区别 SQL命令语句小技巧 JQUERY判断CHECKBOX是否选中三种方法 JS中!=、==、!==、===的用法和区别 在对象比较中,对象相等和对象一致分别指的是什么?
- asp.net无法获取iis目录的问题解决方法
- 遍历获取ASP.NET页面控件的名称及值 后台调用前台javascript方法报错:“缺少对象”的解决方法 xml与DataSet的互转换类
- 解决asp.net mvc UpdateModel更新对象后出现null问题的方法
- 轻松解决asp.net用户ASPNET登录失败问题的方法分享
- 解决asp.net mvc UpdateModel更新对象后出现null问题的方法
- 用ASP.NET解决用户意外退出在线列表无法及时更新问题的方法
- Net反射技术应用解决对象不同版本方法不同参数的问题(转)
- ASP.NET 访问Excel 失败的解决方法
- Asp.net解决无效的 CurrentPageIndex 值.它必须大于等于 0 且小于 PageCount!的问题方法