.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 歡迎加群交流
如果您認為這篇文章還不錯或者有所收獲,您可以點擊右下角的【推薦】按鈕精神支持,因為這種支持是我繼續寫作,分享的最大動力!

作者:LouieGuo
聲明:原創博客請在轉載時保留原文鏈接或者在文章開頭加上本人博客地址,如發現錯誤,歡迎批評指正。凡是轉載於本人的文章,不能設置打賞功能,如有特殊需求請與本人聯系!

微信公眾號:歡迎關注                                                 QQ技術交流群: 歡迎加群

                


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM