.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技術交流群: 歡迎加群