.NET Core2.1下采用EFCore比较原生IOC、AspectCore、AutoFac之间的性能
一、前言
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 交流群:787464275 欢迎加群交流
如果您认为这篇文章还不错或者有所收获,您可以点击右下角的【推荐】按钮精神支持,因为这种支持是我继续写作,分享的最大动力!
微信公众号:欢迎关注 QQ技术交流群: 欢迎加群