项目使用了 Microsoft.Extensions.DependencyInjection 2.x 版本,遇到第2次请求时非常高的内存占用情况,于是作了调查,本文对 3.0 版本仍然适用. 先说结论,可以转到ServiceProvider章节,为了在性能与开销中获取平衡,Microsoft.Extensions.DependencyInjection在初次请求时使用反射实例化目标服务,再次请求时异步使用表达式树替换了目标实例化委托,使得后续请求将得到性能提升. IServiceProvider…
[TOC] 前言 项目使用了 Microsoft.Extensions.DependencyInjection 2.x 版本,遇到第2次请求时非常高的内存占用情况,于是作了调查,本文对 3.0 版本仍然适用. 先说结论,可以转到ServiceProvider章节,为了在性能与开销中获取平衡,Microsoft.Extensions.DependencyInjection在初次请求时使用反射实例化目标服务,再次请求时异步使用表达式树替换了目标实例化委托,使得后续请求将得到性能提升. IServic…
目录 准备工作 大量接口与实现类的生成 elasticsearch+kibana+apm asp.net core 应用 请求与快照 Kibana 上的请求记录 请求耗时的分析 请求内存的分析 第2次快照与第1次快照的对比:依赖注入加载完成 第3次与第2次快照的对比:接口被实例化,委托被缓存 第4次与第3次快照的对比:使用表达式树生成委托更新原有委托 Summary 准备工作 Visual Studio 从2015 版本起携带了诊断工具,可以很方便地进行实时的内存与 CPU 分析,将大家从内存…
目录 前文回顾 IServiceCallSite CallSiteFactory ServiceProviderEngine CompiledServiceProviderEngine DynamicServiceProviderEngine 测试参数 -m|method -t|target -n|number -c|cache -l|loop 启动测试 测试结果 反射 表达式树 Emit 与表达式差异不大 开销对比 前文回顾 Microsoft.Extensions.DependencyInj…
目录 前文回顾 IServiceCallSite CallSiteFactory ServiceProviderEngine CompiledServiceProviderEngine DynamicServiceProviderEngine 测试参数 -m|method -t|target -n|number -c|cache -l|loop 启动测试 测试结果 反射 表达式树 Emit 与表达式差异不大 开销对比 源代码相关 前文回顾 Microsoft.Extensions.Depende…
目录 准备工作 大量接口与实现类的生成 elasticsearch+kibana+apm asp.net core 应用 请求与快照 Kibana 上的请求记录 请求耗时的分析 请求内存的分析 第2次快照与第1次快照的对比:依赖注入加载完成 第3次与第2次快照的对比:接口被实例化,委托被缓存 第4次与第3次快照的对比:使用表达式树生成委托更新原有委托 Summary 准备工作 接 Microsoft.Extensions.DependencyInjection 之一:解析实现 Visual St…
写这篇文章的心情:激动 Microsoft.Extensions.DependencyInjection在github上同样是开源的,它在dotnetcore里被广泛的使用,比起之前的autofac,unity来说,它可以说是个包裹,或者叫适配器,它自己提供了默认的DI实现,同时也支持第三方的IOC容器,在这段时间里使用了它,就想,这东西为什么被在dotnetcore里大放异彩?为什么会全程使用它?从程序的开始到程序启动起来,你可以发现它无处不在,在框架里是这样,在业务层同时也是这样. 聊聊Mi…
没有 Autofac DryIoc Grace LightInject Lamar Stashbox Unity Ninject 的日子,才是好日子~~~~~~~~~~ Using .NET Core 3.0 Dependency Injection and Service Provider with WPF   UPDATE: this article is based on a preview release of .NET Core 3.0. Please refer to Update…
git clone MvvmLight失败,破网络, 就没有直接修改源码的方式来使用了 Nuget安装MvvmLightLibsStd10 使用GalaSoft.MvvmLight.Command命名空间下的RelayCommand会有一个Bug, CanExecute的返回不会更新UI, 在GalaSoft.MvvmLight.CommandWpf中进行了Fixed, 然而MvvmLightLibsStd10并没有GalaSoft.MvvmLight.CommandWpf, 直接粗暴的把Gal…
Microsoft.Extensions.DependencyInjection中(下面简称DI)的Transient依赖注入关系,表示每次DI获取一个全新的注入对象.但是使用Transient依赖注入关系时,最好要配合IServiceScope来一起使用,因为通过Transient依赖注入关系创建的对象,都会被创建它的ServiceProvider对象内部引用,这样会造成注入对象无法被GC及时回收,造成内存泄漏,只有当调用ServiceProvider对象的Dispose方法后,Service…
我的代码里将IServiceProvider放入ServiceLocator中遇到的问题. 注:以下所有例子都是Console里的结论,AspNetCore里不管怎么玩都没有问题,有其他帖子测试出在Asp.net Core里也存在问题,具体他怎么一个写法导致的没细研,在目前我自己项目中用到的范围内Web环境一切OK. 方案1:每次获取IServiceProvider 需要_services.BuildServiceProvider(); :其中private static IServiceCol…
这篇随笔主要记录一下ASP.NET Core团队实现默认的依赖注入容器的过程,我的理解可能并不是正确的. DependencyInjection这个项目不大,但却是整个ASP.NET Core的基础,因为它提供了依赖注入(DI)容器的默认实现,而依赖注入贯穿整个ASP.NET Core.相关源码可以去GitHub AspNet 上下载. 要实现是一个依赖注入容器,主要是实现它添加依赖.描述依赖.存储依赖和解析依赖的能力,可以分别用Add(A), Describe(D), Store(S), Re…
在上一篇文章中我们主要分析了ASP.NET Core默认依赖注入容器的存储和解析,这一篇文章主要补充一下上一篇文章忽略的一些细节:有关服务回收的问题,即服务的生命周期问题.有关源码可以去GitHub上找到. 这次的主角就是ServiceProvider一人,所有有关生命周期的源码几乎都集中在ServiceProvider.cs这个文件中. 我们知道服务的生命周期由三种,分别是: Transient Scoped Singleton 首先给出我的结论:这三种生命周期类别本质上没有区别,服务的生命周…
一. 关于IServiceCollection接口的设计 public interface IServiceCollection : IList<ServiceDescriptor> { } a. 为什么不直接用List<>集合,而要重新定义一个这样的IServiceCollection接口呢? 1. 为了从IList<>那里得到所有的List集合的可重载方法:2. 有了自已的名字IServiceCollection,而不是List<>这样直接使用,如果直接…
在.NET Core项目中,日志记录是通过依赖项注入进行管理的. 尽管这对于ASP.NET项目效果很好,但在启动Startup.cs中的新项目时,所有这些都会自动创建,而在控制台应用程序中则需要一些配置才能使其启动并运行. 这大部分是从此处的博客文章整理而成的,但我对其进行了修改. 该项目是在Visual Studio 2019中创建的,并且需要以下程序包(在csproj文件中找到) <ItemGroup> <PackageReference Include="Microsof…
什么是Microsoft.Extensions .NET Platform Extensions是一套.Net官方的API集合,提供了一些常用的编程模式和实用工具,例如依赖项注入.日志记录.缓存.Host以及配置等等. https://docs.microsoft.com/en-us/dotnet/api/?view=dotnet-plat-ext-6.0 https://github.com/aspnet/Announcements/issues/411 .NET Platform Exten…
在.Net core中,微软放弃了笨重基于XML的.Config配置文件(好吧,像我这种咸鱼早都忘了如何自己写一个Section了). 现在主推新的高度可扩展的配置文件(参见此处) 对于新的配置系统,既可以通过IConfigurationSection.Value手工一个个获取配置项的值(神烦无比,别问我怎么知道的),也可以通过选择模式(options pattern)通过POCO(Plain Old CLR Object)类读取配置(参见如下代码片段:) //配置POJO如下: /* publ…
asp.net core微软官方为日志提供了原生支持,有如下实现 Console Debug EventLog AzureAppServices TraceSource EventSource 并且在asp.net core项目模板中默认开启Comsole,Debug的日志输出 在实际生产中仅仅是控制台的日志输出是不够的,我们希望使用持久化的载体,例如文本txt文件 Huanent.Logging.File是Microsoft.Extensions.Logging的文本文件日志的实现,使用方法非…
本文目录 1. Net下日志记录 2. NLog的使用     2.1 添加nuget引用NLog.Web.AspNetCore     2.2 配置文件设置     2.3 依赖配置及调用     2.4 日志类型介绍     2.5 产生的日志文件 3. 基于Microsoft.Extensions.Logging封装     3.1 添加引用Microsoft.Extensions.Logging     3.2 实现我们的Logger     3.3 调用WLogger 4. 总结 1.…
解决方法:工具-nuget管理包-程序管理控制台-选择 项目- 执行 -Install-Package Microsoft.Extensions.Configuration.Abstractions -Version 2.1.1命令即可.…
前提: 需要nuget   Microsoft.Extensions.Logging.Log4Net.AspNetCore   2.2.6: 描述:解决 .net core 微软日志工厂 Microsoft.Extensions.Logging  增加 log4net 的日志输出,暂时分为 info,Error,Debug 三种类型,按天记录: 实际效果: .net core webapi 解决办法: 办法1 修改  Program.cs 配置 log4net public class Prog…
Microsoft.Extensions.Logging 日志组件拓展 文件文本日志 文件文本日志UI插件 自定义介质日志 Microsoft.Extensions.Logging.File文件文本日志 安装配置完插件后,你的asp.net core程序会将输出的日志保存在程序根目录下的logs文件夹,并以日期划分文件名 配置 安装Huanent.Logging.File nuget包 在Program.cs文件中添加 public static IWebHost BuildWebHost(st…
Unable to resolve service for type 'Microsoft.Extensions.Logging.ILogger' while attempting to activate 'xxxxx.Controllers.xxxxController'. 构造注入时需要加入类名 public class BookSizesController : Controller { private readonly ILogger<BookSizesController> _log…
阅读目录 利用ODBC去操作 利用TextFieldParser操作 写了个Demo,利用Microsoft.VisualBasic这个程序集中的TextFieldParser解析器解析CSV格式的文件,然后将解析的数据插入到相关表,这样的好处是不用去用令人头疼的ODBC去操作CSV格式文件,如之前是这样去操作: 利用ODBC去操作 string strConnString = "Driver={Microsoft Text Driver (*.txt; *.csv)};Dbq=" +…
不知何时,微软 MSDN 订阅软件下载服务IP解析有问题,总是在点击“下载”按钮之后无法打开. 想必又跟“国情”有关,我是使用联通宽带,没测试过电信的. 我是可以通过指定hosts entry来解决: 72.21.81.200 download.msdn.microsoft.com 我是通过VPN连接至美国,再PING此域名得到该IP地址. 如果您也遇到相同的问题,可以试一下.…
既然是依赖注入容器,必然会涉及到服务的注册,获取服务实例,管理作用域,服务注入这四个方面. 服务注册涉及如何将我们的定义的服务注册到容器中.这通常是实际开发中使用容器的第一步,而容器本身通常是由框架来实例化的,大多数时候,并不需要自己初始化容器. 获取服务实例这一步,在实际开发中通常也不涉及,服务示例一般是通过注入来实现的.这里只是为了让我们对容器的使用了解的更全面一些. 管理作用域一般在开发中也不涉及,框架,例如 .NET 的 MVC 框架已经帮我们把这个问题处理了. 服务注入是我们需要关注的…
前言 笔者的这篇文章和上篇文章思路一样,不注重依赖注入的使用方法,更加注重源码的实现,我尽量的表达清楚内容,让读者能够真正的学到东西.如果有不太清楚依赖注入是什么或怎么在.Net项目中使用的话,请点击这里,这是微软的官方文档,把用法介绍的很清晰了,相信你会有很大收获.那么废话不多说,咱们进入正题(可能篇幅有点长,耐心读完你会有收获的). DependencyInjection类之间的关系 下图中只列举重要的类和接口(实际的类和接口有很多),里面的方法和属性也只列出重要的,这里只是让你有个大概的印…
在学习 Asp.Net Core 的过程中,注入可以说是无处不在,对于 .Net Core 来说,它是独立的一个程序集,没有复杂的依赖项和配置文件,所以对于学习 Asp.Net Core 源码的朋友来说,注入作为一个起点非常合适,园子里确实有许多关于注入的博客,不过 .Net Core2.0 已经出来了,注入这一块做了一些 更新,其实有不少 .net 开发人员对微软改来改去这一点不是很满意,加大了学习成本,其实改动分为两种,一种是 Asp.Net Core Mvc 常用 Api 接口的更改(或者…
回顾 通过前两节的学习,我们知道 IServiceCollection 以元数据(ServiceDescriptor)的形式存放着用户注册的服务,它的 IServiceCollection 的拓展方法 BuildServiceProvider 为我们提供一个默认的容器 ServiceProvider,然而创建实例对象的任务并不是由他完成的,具体的是引擎 IServiceProviderEngine(更准确点是抽象类 ServiceProviderEngine) 类型来完成的,可以这么说,整个创建…
作者:陈希章 发表于 2017年6月25日 谈一谈.NET 的跨平台 终于要写到这一篇了.跨平台的支持可以说是 Office 365 平台在设计伊始就考虑的目标.我在前面的文章已经提到过了,Microsoft Graph 服务针对一些主流的开源平台(主要用来做跨平台应用)都有支持,例如 python,nodejs 等.他们真的非常好用,与此同时我虽然对他们也有一定的了解,但要跟我最熟悉的 Microsoft .NET 来比较的话,我自然还是更喜欢后者了. 所以,一直在等待合适的时间,要来写 Mi…