一、前言


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接口,来比较所耗费的时间

#ValuesController

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

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

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

                

.NET Core2.1下采用EFCore比较原生IOC、AspectCore、AutoFac之间的性能的更多相关文章

  1. 六、CLR下的托管代码应用程序与非托管代码程序之间的性能对比

    1.托管程序二次编译的问题,以及微软做的优化 五.CLR加载程序集代码时,JIT编译器对性能的产生的影响中介绍了CLR下托管应用程序的二次编译对性能产生的影响.事实上,在IL编译成本机代码的时候的时候 ...

  2. 在Ubuntu 12.04下采用apt-get的方法安装Qt4

    在Ubuntu 12.04下采用apt-get的方法安装Qt4 注:之前发表的一篇博客是采用编译源码的方式安装Qt4,这是很有用的方式,因为源码安装对于所有系统都是通用的,其次,在使用交叉编译器的时候 ...

  3. 在VC下采用ADO实现BLOB(Binary)数据的存储,读取,修改,删除。

    在VC下采用ADO实现BLOB(Binary)数据的存储,读取,修改,删除. 作者:邵盛松 2009-09-05 前言 1关于的BLOB(Binary)数据的存储和读取功能主要参考了MSDN上的一篇& ...

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

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

  5. .net core2.0下Ioc容器Autofac使用

    .net core发布有一段时间了,最近两个月开始使用.net core2.0开发项目,大大小小遇到了一些问题.准备写个系列介绍一下是如何解决这些问题以及对应技术.先从IOC容器Autofac开始该系 ...

  6. Net Core2.0下使用Dapper

    Net Core2.0下使用Dapper 今天成功把.Net Framework下使用Dapper进行封装的ORM成功迁移到.Net Core 2.0上,在迁移的过程中也遇到一些很有意思的问题,值得和 ...

  7. VMware Workstation下VMnet1等虚拟网卡与主机网卡之间的关系

    VMware Workstation下VMnet1等虚拟网卡与主机网卡之间的关系 本文出自 "王春海的博客" http://wangchunhai.blog.51cto.com/2 ...

  8. 性能测试 CentOS下结合InfluxDB及Grafana图表实时展示JMeter相关性能数据

    CentOS下结合InfluxDB及Grafana图表实时展示JMeter相关性能数据   by:授客 QQ:1033553122 实现功能 1 测试环境 1 环境搭建 2 1.安装influxdb ...

  9. CentOS下采用Crontab实现PHP脚本定时任务

    简单实现一个需求,每5分钟往特定表中插入2条数据.经过分析还是采用crontab方式靠谱,另外执行php脚本的方式,不用担心链接超时等问题. 1.准备工作,创建1个数据表“person”, CREAT ...

随机推荐

  1. 2017萧山第5场(2016 Pacific Northwest - Division 1)

    B:Buggy Robot [题意] 一个n*m的地图(1≤n, m≤50),有一个入口和一个出口.给定一个命令序列(上,下,左,右),如果碰到障碍或者边际就忽略.问至少加入或删除多少个的命令,使得能 ...

  2. Oracle GoldenGate常用参数

    OGG(Oracle GoldenGate)参数介绍 所有的GoldenGate进程均有参数文件 Manager Extract Replicat Utilities 所有参数均有缺省配置 实际应用只 ...

  3. Linux IO调度算法

    Linux IO调度算法  操作系统的调度 CPU调度    CPU scheduler IO调度       IO scheduler   IO调度器的总体目标是希望让磁头能够总是往一个方向移动,移 ...

  4. Linux基础-软硬连接Block概念

    建立/etc/passwd的软连接文件,放在/tmp目录下 使用文件名方式建立的软连接可以跨分区,删除目标文件后,软连接文件失效 建立/etc/passwd的硬链接文件,放在/boot下,如果不成功, ...

  5. Entity Framework(EF的Code First方法)

    EntityFramework,是Microsoft的一款ORM(Object-Relation-Mapping)框架.同其它ORM(如,NHibernate,Hibernate)一样, 一是为了使开 ...

  6. ASM配置OGG

    两种方法:http://blog.sina.com.cn/s/blog_aa84cfe40101lsks.html 使用ACFS配置OGG:http://ylw6006.blog.51cto.com/ ...

  7. ubuntu网络连接:Ifupdown(eth0)的连接不能修改或删除

    今天其实遇到了三个问题,一个是ubuntu系统上的网络图标不见了,把网络图标弄出来以后有无法联网,联网成功却变成Ifupdown(eth0)的连接且不能修改或删除. 这里我只记录最后一个问题,前两个问 ...

  8. Python基础:内置类型(未完待续)

    本文根据Python 3.6.5的官文Built-in Types而写. 目录 1.真值测试 2.布尔操作 -- and, or, not 3.比较 4.数字型 -- int, float, comp ...

  9. python网络编程--进程池

    一:进程池 进程池内部维护一个进程序列,当使用时,则去进程池中获取一个进程, 如果进程池序列中没有可供使用的进进程,那么程序就会等待,直到进程池中有可用进程为止. 进程池中有两个方法: apply a ...

  10. CSS--盒子模型详解

    目录 图解 盒模型尺寸基准 使用浏览器的开发者工具,查看元素高(宽)度时,遇到的问题 一.图解 说明:由内而外依次是content.padding(内边距).border(边框).margin(外边距 ...