一、前言


ASP.NET Core本身已经集成了一个轻量级的IOC容器,开发者只需要定义好接口后,在Startup.cs的ConfigureServices方法里使用对应生命周期的绑定方法即可,常见方法如下

services.AddTransient<IApplicationService,ApplicationService>
services.AddScoped<IApplicationService,ApplicationService>
services.AddSingleton<IApplicationService,ApplicationService>

除了ASP.NETCore自带的IOC容器外,我们还可以使用其他成熟的DI框架,如Autofac,StructureMap等(笔者只用过Unity,Ninject和Castle,Castle也是使用ABP时自带的),以及AspectCore

二、性能比较


1、新建三个.NET Core2.1项目(项目比较源码将会发到github上)

分别为:IOCDemo、Autofac、AspectCoreDemo

2、在每个项目配置

A、在每个项目中都添加EFCore的 mysql的nuget包。

注:如果引入的nuget包 Pomelo.EntityFrameworkCore.Mysql 是2.0以上的版本(不包含2.0),则需要再多引入 Microsoft.EntityFrameworkCore.Design

B、新建数据上下文LGDbContext(每个项目)

public class LGDbContext : DbContext{public LGDbContext(DbContextOptions<LGDbContext> options) : base(options) { }#region public DbSet<User> User { get; set; }#endregion}public class User{public int Id { get; set; }public string UserName { get; set; }public int WorkId { get; set; }public string Pwd { get; set; }}

C、在原生的IOC项目中配置Startup.cs

public void ConfigureServices(IServiceCollection services){services.AddDbContext<LGDbContext>(a =>{a.UseMySql("Server=xxxxx;database=xxxx;port=3306;uid=root;pwd=xxx;Character Set=utf8;SslMode = none;");});services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);}

D、在aspectCore项目中配置

1、需要添加aspectCore的nuget包。

2、在startup.cs 文件中替换原生的IOC

public IServiceProvider ConfigureServices(IServiceCollection services){services.AddDbContext<LGDbContext>(a =>{a.UseMySql("Server=xxx;database=xxx;port=3306;uid=root;pwd=xxxx;Character Set=utf8;SslMode = none;");});services.AddMvc();var container = services.ToServiceContainer();return container.Build();}

E、在AutofacDemo项目中配置

1、添加autofac的nuget包

2、在startup.cs 文件中替换原生的IOC

public IServiceProvider ConfigureServices(IServiceCollection services){services.AddDbContext<LGDbContext>(a =>{a.UseMySql("Server=xxx;database=xxx;port=3306;uid=root;pwd=xxxx;Character Set=utf8;SslMode = none;");});services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);var containerBuilder = new ContainerBuilder();//containerBuilder.RegisterModule<DefaultModule>();
            containerBuilder.Populate(services);var container = containerBuilder.Build();return new AutofacServiceProvider(container);}

 F、三个项目都配置完后就在每个项目中配置 Controller接口,来比较所耗费的时间

#ValuesControllerpublic class ValuesController : ControllerBase{private readonly LGDbContext _lGDbContext;public ValuesController(LGDbContext lGDbContext){_lGDbContext = lGDbContext;}// GET api/values
        [HttpGet]public ActionResult<string> Get(int workid, string pwd){Stopwatch sw = new Stopwatch();sw.Start();var user = _lGDbContext.User.FirstOrDefault(a => a.WorkId == workid && a.Pwd == pwd);sw.Stop();TimeSpan ts2 = sw.Elapsed;Console.WriteLine("Stopwatch总共花费{0}s.", ts2.TotalSeconds);return Ok();}}

以上配置完成后,我们就可以运行三个项目啦。我们来看一下各自所用的时间。

以下是分别运行的单独项目。

aspectCore耗费时间

autofac 耗费时间

原生IOC耗费时间

下面是一起运行的项目的耗费时间

总得比较

aspectCore  》 autofac 》 原生IOC

不过aspect core 与autofac差不了多少。具体根据你们项目中的使用吧。

当然其他的DI框架,目前没有进行比较。如果大家有兴趣可以多多比较以下。

github源码:https://github.com/LouieGuo/LG_ComapreDI_Demo

asp.net core 交流群:787464275 欢迎加群交流
如果您认为这篇文章还不错或者有所收获,您可以点击右下角的【推荐】按钮精神支持,因为这种支持是我继续写作,分享的最大动力!

作者:LouieGuo
声明:原创博客请在转载时保留原文链接或者在文章开头加上本人博客地址,如发现错误,欢迎批评指正。凡是转载于本人的文章,不能设置打赏功能,如有特殊需求请与本人联系!

微信公众号:欢迎关注                                                 QQ技术交流群: 欢迎加群

                

转载于:https://www.cnblogs.com/guolianyu/p/9981564.html

.NET Core2.1下采用EFCore比较原生IOC、AspectCore、AutoFac之间的性能相关推荐

  1. 在生产环境下处理EFCore数据库迁移的五种方法

    在生产环境下处理EFCore数据库迁移的五种方法 原文链接:https://www.thereformedprogrammer.net/handling-entity-framework-core-d ...

  2. 深入解析Express下采用bcryptjs进行密码加密

    本篇文章主要介绍了Express下采用bcryptjs进行密码加密的方法,写的十分的全面细致,具有一定的参考价值,对此有需要的朋友可以参考学习下.如有不足之处,欢迎批评指正. bcrypt,是一个跨平 ...

  3. 【OSX】OSX下采用MAMP的PHP替换系统自带PHP

    OSX下采用MAMP的PHP替换系统自带PHP 前言 众所周知,OSX自带了PHP和Apache,显然这些不是我们需要的. 很多人都会安装集成环境作为自己的开发环境.比如我选择的是MAMP,PHP的版 ...

  4. .net core2.0下使用Identity改用dapper存储数据

    前言. 已经好多天没写博客了,鉴于空闲无聊之时又兴起想写写博客,也当是给自己做个笔记.过了这么些天,我的文笔还是依然那么烂就请多多谅解了.今天主要是分享一下在使用.net core2.0下的实际遇到的 ...

  5. linux 商业游戏,Ubuntu下安装试玩原生Linux版商业游戏Braid

    这款原生Linux版商业游戏Braid国外出售价大约在80美元左右.每年在Linux平台上发布的原生商业游戏是屈指可数,而且这些游戏的质量也是参差不齐. 不过这款原生Linux版商业游戏Braid还是 ...

  6. 【数据匮乏场景下采用生成对抗网络的 光伏出力场景预测方法】

    背景介绍 生成对抗网络(GANs)是由两个网络组成的深度神经网络体系结构,它将一个网络与另一个网络相互对立(因此称为"对抗性"). 2014年,Ian Goodfellow和包括Y ...

  7. ubuntu10.04.04在windows下采用WUBI安装(nvidia显卡GeForce 405),附带中文输入法安装

    起因:在windwos下安装虚拟机,在运行linux,赶脚系统运行的特慢,还经常卡机:后想在机子上直接安装ubuntu系统,赶脚那个速度,那个体验还是不必win7差的,虽然是10.04的版本:以下是本 ...

  8. 如何实现上拉加载,下拉刷新(原生)?

    下拉刷新和上拉加载这两种交互方式通常出现在移动端中 一.实现原理: 1.上拉加载的本质是页面触底,或者快要触底时的动作: 判断页面触底我们需要先了解一下下面几个属性 scrollTop:滚动视窗的高度 ...

  9. Linux下采用ss5搭建sock5服务器使用proxychains进行sock5客户端代理

    Linux下采用ss5搭建sock5服务器&使用proxychains进行sock5客户端代理 1.ss5搭建sock5服务器 1.1下载ss5源码 1.2安装相关yum依赖 1.3编绎安装 ...

最新文章

  1. CVPR2020:三维实例分割与目标检测
  2. 易飞90设计自己定义画面新增功能说明
  3. Android之Log工具类使用
  4. angularJS和jQuery的区别
  5. 全球及中国食品色素行业供应前景与发展趋势研究报告2022版
  6. ytu 2335: 0-1背包问题
  7. 一个关于Angular Directive selector里的中括号使用问题
  8. Vim配置IDE开发环境
  9. Codeforces Round #586 (Div. 1 + Div. 2) B. Multiplication Table 思维 + 公式
  10. c语言正确声明的格式,c语言函数声明(c语言函数声明格式)
  11. java导出word特殊符号,Word2019中输入特殊符号的方法
  12. 应急指挥中心建设方案
  13. 超星PDG格式转换成PDF格式及其它格式
  14. 【小墨mysql】mysql系列之一---索引
  15. mysql打开网络访问权限_四种方法打开MySQL数据库远程访问权限
  16. app运营中,如何提高用户活跃度?
  17. 风拂树,月下杯影为伊留...
  18. python的IDLE打不开如何解决
  19. 数据处理分析模块 Pandas(3)
  20. srsLTE 源码分析 UE_08 随机接入 之开启前的准备

热门文章

  1. exe程序获得外部传入命令行方法
  2. CSS实战经验:灵活运行注释带来的益处(转载)
  3. 99.两个时钟不同步的设备怎么通信?
  4. 经典教材《模式识别和机器学习》官方免费下载!
  5. HANDLE:句柄的概念
  6. 华为荣耀畅玩7c计算机在那,华为荣耀畅玩7C
  7. php指定长度 分割整形,php指定长度分割字符串str_split函数用法示例
  8. druid连接池mysql5.7_Spring Boot 使用Druid连接池整合Mybatis-Plus连接Mysql数据库
  9. linux安装字体后wps无法打开,Ubuntu安装WPS后提示缺失字体怎么办?
  10. php面向对象调用方法,在面向对象的php中调用方法