日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

Abp太重了?轻量化Abp框架

發布時間:2023/12/4 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Abp太重了?轻量化Abp框架 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本文首發于個人博客(https://blog.zhangchi.fun/)

在進行框架的選型時,經常會聽到“***框架太重了”之類的聲音,比如“Abp太重了,不適合我們...”。事實上,Abp框架真的很重嗎?

框架的“輕”和“重”,我沒有在網上找到明確的定義,通過閱讀一些技術博客,大致可以把框架的“輕”和“重”通過以下幾個方面進行區分:

  • 所依賴程序集的數量

  • 所實現的功能的多少

  • 上手難度及易用性

“輕量級”的框架,大概指的是一個程序集依賴少且程序集文件小、功能雖少但足夠滿足需求、上手容易使用簡單的框架;“重量級”的框架,大概指的是一個程序集依賴多且程序集文件大、功能豐富但大多數用不到、上手困難且使用困難的框架。

這篇文章將從上述幾個方面來探索Abp是一個“輕量級”還是“重量級”的框架。

最小依賴

Abp開發了一些啟動模板來為我們生成項目。啟動模板采用了領域驅動設計的分層方案來建立項目層級,包括了展示層應用層領域層基礎設施層

我們通常都會通過Abp CLI或Abp.io來創建類似上圖架構的項目。Abp為我們生成的項目,減少了我們初始化項目的工作量,開箱即用,因此將我們可能會使用的Nuget包預先引入到我們的項目中,也就給我們一種依賴項太多的感覺。

從架構設計上來講,模塊化是Abp的核心;而從技術角度來看,依賴注入則是Abp實現眾多功能的一個主要手段。只要了解Abp的模塊化依賴注入,我們就能夠基于Abp框架來進行項目開發。

接下來將創建一個原生的ASP.NET Core Web API項目,圍繞模塊化依賴注入兩個核心概念,來展示如何以最小依賴的方式使用Abp。

  • 通過VS或者dotNet cli新建一個原生的ASP.NET Core Web API項目,命名為LightweightAbp;

  • 安裝Nuget包Volo.Abp.Autofac和Volo.Abp.AspNetCore.Mvc;

  • 將項目進行模塊化:在項目根目錄新建一個Abp模塊代碼文件LightweightAbpModule.cs,并復制以下代碼:

[DependsOn(typeof(AbpAutofacModule),typeof(AbpAspNetCoreMvcModule))] public class LightweightAbpModule : AbpModule {public override void ConfigureServices(ServiceConfigurationContext context){}public override void OnApplicationInitialization(ApplicationInitializationContext context){} }
  • 將Startup中的代碼調整到LightweightAbpModule中,代碼如下:

[DependsOn(typeof(AbpAutofacModule),typeof(AbpAspNetCoreMvcModule))] public class LightweightAbpModule : AbpModule {public override void ConfigureServices(ServiceConfigurationContext context){context.Services.AddControllers();context.Services.AddSwaggerGen(c =>{c.SwaggerDoc("v1", new OpenApiInfo { Title = "LightweightAbp", Version = "v1" });});}public override void OnApplicationInitialization(ApplicationInitializationContext context){var app = context.GetApplicationBuilder();var env = context.GetEnvironment();if (env.IsDevelopment()){app.UseDeveloperExceptionPage();app.UseSwagger();app.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "LightweightAbp v1"));}app.UseRouting();app.UseAuthorization();app.UseEndpoints(endpoints =>{endpoints.MapControllers();});} }
  • 更改Startup中的代碼以使用Abp的模塊化系統:

public class Startup {public void ConfigureServices(IServiceCollection services){services.AddApplication<LightweightAbpModule>();}public void Configure(IApplicationBuilder app, IWebHostEnvironment env, ILoggerFactory loggerFactory){app.InitializeApplication();} }
  • 更改Program的CreateHostBuilder方法以使用Abp的依賴注入系統(基于Autofac):

public static IHostBuilder CreateHostBuilder(string[] args) =>Host.CreateDefaultBuilder(args).ConfigureWebHostDefaults(webBuilder =>{webBuilder.UseStartup<Startup>();}).UseAutofac();
  • 將項目生成的WeatherForecastController基類ControllerBase更改為AbpController。

  • 按F5運行。

至此項目的創建完成了。可以看到,僅僅依賴了Volo.Abp.Autofac和Volo.Abp.AspNetCore.Mvc兩個Nuget包,即可利用Abp進行開發。若從所依賴Nuget包數量來評估框架的“輕”和“重”,那么Abp不可謂不輕。

功能按需使用

得益于模塊化設計,Abp將其所能提供的功能,劃分并封裝到了不同的模塊中。要想使用Abp提供的某一功能,只需引入相關的Nuget包并依賴(DependsOn)模塊即可。

數據訪問

要想實現數據訪問功能,首先我們需要定義Entity、DbContext并配置數據庫支持。在Abp的層次架構中,Entity、Repository屬于領域層,Service屬于應用層,DbContext則屬于EntityFramework Core模塊,因此我們按需引入所需模塊即可。

  • 安裝Nuget包Volo.Abp.Ddd.Application、Volo.Abp.Ddd.Domain和Volo.Abp.EntityFrameworkCore.Sqlite;

  • 在LightweightAbpModule類中配置DependsOn特性,將AbpDddApplicationModule、AbpDddDomainModule和AbpEntityFrameworkCoreSqliteModule模塊依賴到我們的項目模塊中。

[DependsOn(typeof(AbpAutofacModule),typeof(AbpAspNetCoreMvcModule),typeof(AbpDddApplicationModule),typeof(AbpDddDomainModule),typeof(AbpEntityFrameworkCoreSqliteModule))]public class LightweightAbpModule : AbpModule{ ... }
  • 然后創建實體Book及數據庫上下文LightweightAbpDbContext:

using System; using Volo.Abp.Domain.Entities;namespace LightweightAbp {public class Book : Entity<Guid>{public string Name { get; set; }} }[ConnectionStringName("Default")] public class LightweightAbpDbContext : AbpDbContext<LightweightAbpDbContext> {public LightweightAbpDbContext(DbContextOptions<LightweightAbpDbContext> options): base(options){ }public DbSet<Book> Books { get; set; }protected override void OnModelCreating(ModelBuilder builder){base.OnModelCreating(builder);builder.Entity<Book>(b =>{b.ToTable(nameof(Books));});} }
  • 在LightweightAbpModule的ConfigureServices方法中配置數據庫訪問:

public override void ConfigureServices(ServiceConfigurationContext context) {...context.Services.AddAbpDbContext<LightweightAbpDbContext>(options =>{options.AddDefaultRepositories(includeAllEntities: true);});Configure<AbpDbContextOptions>(options =>{options.UseSqlite();}); }
  • 在appsettings.json中配置數據庫連接字符串

{..."ConnectionStrings": {"Default": "Data Source=LightweightAbp.db"} }
  • 安裝Nuget包"Microsoft.EntityFrameworkCore.Tools",并在在項目根目錄下打開命令行工具,依次執行以下命令進行數據遷移和數據庫更新:

dotnet ef migrations add InitialCreate dotnet ef database update
  • 創建IBookAppService及BookAppService:

public interface IBookAppService {Task CreateAsync(string name); } public class BookAppService : ApplicationService, IBookAppService {public IRepository<Book, Guid> Repository => LazyServiceProvider.LazyGetRequiredService<IRepository<Book, Guid>>();public async Task<string> CreateAsync(string name){var book = await Repository.InsertAsync(new Book(){Name = name});return book.Name;} }
  • 在文件夾Controllers中創建BookController:

[ApiController] [Route("[controller]")] public class BookController : AbpController {private readonly IBookAppService _service;public BookController(IBookAppService service){_service = service;}[HttpGet]public Task<string> CreateAsync(string name){return _service.CreateAsync(name);} }
  • F5以調試模式運行即可在Swagger頁面上插入數據:

這里我們實現了簡單的數據插入。可以看到,項目中并沒有使用復雜架構和復雜的領域驅動設計,僅引用并配置Abp模塊,即可使用常規的?ASP.NET Core Web API方式進行開發。

緩存

接下來我們將繼續實現緩存功能。

  • 引用Nuget包Volo.Abp.Caching并向LightweightAbpModule添加AbpCachingModule模塊依賴;

  • 修改IBookAppService及BookAppService實現GetAllAsync方法:

public interface IBookAppService {Task<string> CreateAsync(string name);Task<string[]> GetAllAsync(); } public class BookAppService : ApplicationService, IBookAppService {private readonly IRepository<Book, Guid> _repository;private readonly IDistributedCache<string[]> _cache;public BookAppService(IRepository<Book, Guid> repository,IDistributedCache<string[]> cache){_repository = repository;_cache = cache;}public async Task<string> CreateAsync(string name){ ... }public async Task<string[]> GetAllAsync(){return await _cache.GetOrAddAsync("AllBooksName",async () => await _repository.Select(b => b.Name).ToArrayAsync(),() => new DistributedCacheEntryOptions{AbsoluteExpiration = DateTimeOffset.Now.AddHours(1)});} }
  • 修改BookAppService實現GetAllAsyncAPI接口:

public class BookController : AbpController {...[HttpGet("all")]public Task<string[]> GetAllAsync(){return _service.GetAllAsync();} }
  • F5以調試方式運行,即可調用實現了緩存功能的GetAllAsync接口。

這里我們實現了緩存功能。顯而易見,按需使用緩存功能所在的Nuget包及模塊即可,并沒有很多繁雜的操作。

眾所周知,Abp實現了相當多的功能,其中有些功能也許整個項目生命周期中都不會用到。得益于模塊化的方式,我們可以只依賴我所需要的Nuget包和Abp模塊。如果根據功能多少來評判框架的“輕”和“重”,我們按需依賴不同模塊時Abp框架不可謂不輕。由此可見,一個框架的“輕”和“重”,有時還會取決于使用方式。

上手難度及易用性

學習一門新技術最好的起點便是官方文檔,Abp也是如此,Abp的官方文檔非常詳盡介紹了各個功能。Abp還為我們提供了啟動模板,模板遵循了領域驅動設計的最佳實踐來進行項目分層,并且為我們繼承了很多項目中常用的功能模塊。

對于初學者而言,面對一個復雜的分層架構及豐富的功能特性支持,一瞬間需要接受非常多的知識,因此會產生無從下手的感覺,進而得出一種上手難度高,框架很“重”的結論。

如果從另外一種角度來學習Abp的話,也許情況會有所不同。在本文之初,我便提出了Abp的核心是模塊化依賴注入的觀點,當我們將入門的重點放在模塊化依賴注入上,那么會發現Abp是一個極易上手并且學習曲線很平緩的框架。正如上文我所進行的代碼演示,如果感覺這個演示項目簡單易學,那么就證明了我這一觀點。

至于易用性,首先Abp實現的功能很全面,我們可以按需使用;其次,隨著對Abp框架的逐步深入,會發現模塊化的設計讓我們的項目集成多種功能變得簡單,并且隨著項目的演進,Abp的模塊化給我們提供了輕易切換到微服務方案的能力;依賴注入系統讓我們能夠輕易的定制并替換Abp默認實現的功能。因此,我認為Abp是一個易于使用的框架。

總結

在這里我們從一個不同的角度來認識了Abp框架,顯而易見,對于Abp來講,是否太“重”,和我們對他的認知及使用方式有很大的關聯。

項目示例代碼將托管在Github中。

致謝

感謝Abp群(QQ群:48039003)的群友們提供的熱心幫助。

總結

以上是生活随笔為你收集整理的Abp太重了?轻量化Abp框架的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。