2021年7月29日星期四

Abp太重了?轻量化Abp框架

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

在进行框架的选型时,经常会听到"***框架太重了"之类的声音,比如"Abp太重了,不适合我们..."。事实上,Abp框架真的很重吗?

框架的"轻"和"重",我没有在网上找到明确的定义,通过阅读一些技术博客,大致可以把框架的"轻"和"重"通过以下几个方面进行区分:

  • 所依赖程序集的数量
  • 所实现的功能的多少
  • 上手难度及易用性

"轻量级"的框架,大概指的是一个程序集依赖少且程序集文件小、功能虽少但足够满足需求、上手容易使用简单的框架;"重量级"的框架,大概指的是一个程序集依赖多且程序集文件大、功能丰富但大多数用不到、上手困难且使用困难的框架。

这篇文章将从上述几个方面来探索Abp是一个"轻量级"还是"重量级"的框架。

最小依赖

Abp开发了一些启动模板来为我们生成项目。启动模板采用了领域驱动设计的分层方案来建立项目层级,包括了展示层应用层领域层基础设施层

Architecture

我们通常都会通过Abp CLI或Abp.io来创建类似上图架构的项目。Abp为我们生成的项目,减少了我们初始化项目的工作量,开箱即用,因此将我们可能会使用的Nuget包预先引入到我们的项目中,也就给我们一种依赖项太多的感觉。

Dependency

从架构设计上来讲,模块化是Abp的核心;而从技术角度来看,依赖注入则是Abp实现众多功能的一个主要手段。只要了解Abp的模块化依赖注入,我们就能够基于Abp框架来进行项目开发。

接下来将创建一个原生的ASP.NET Core Web API项目,围绕模块化依赖注入两个核心概念,来展示如何以最小依赖的方式使用Abp。

  • 通过VS或者dotNet cli新建一个原生的ASP.NET Core Web API项目,命名为LightweightAbp
  • 安装Nuget包Volo.Abp.AutofacVolo.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(); }}
  • 更改ProgramCreateHostBuilder方法以使用Abp的依赖注入系统(基于Autofac):
public static IHostBuilder CreateHostBuilder(string[] args) =>   Host.CreateDefaultBuilder(args)    .ConfigureWebHostDefaults(webBuilder =>    {     webBuilder.UseStartup<Startup>();    })    .UseAutofac();
  • 将项目生成的WeatherForecastController基类ControllerBase更改为AbpController
  • F5运行。

至此项目的创建完成了。可以看到,仅仅依赖了Volo.Abp.AutofacVolo.Abp.AspNetCore.Mvc两个Nuget包,即可利用Abp进行开发。若从所依赖Nuget包数量来评估框架的"轻"和"重",那么Abp不可谓不轻。

功能按需使用

得益于模块化设计,Abp将其所能提供的功能,划分并封装到了不同的模块中。要想使用Abp提供的某一功能,只需引入相关的Nuget包并依赖(DependsOn)模块即可。

数据访问

要想实现数据访问功能,首先我们需要定义EntityDbContext并配置数据库支持。在Abp的层次架构中,EntityRepository属于领域层,Service属于应用层,DbContext则属于EntityFramework Core模块,因此我们按需引入所需模块即可。

  • 安装Nuget包Volo.Abp.Ddd.ApplicationVolo.Abp.Ddd.DomainVolo.Abp.EntityFrameworkCore.Sqlite
  • LightweightAbpModule类中配置DependsOn特性,将AbpDddApplicationModuleAbpDddDomainModuleAbpEntityFrameworkCoreSqliteModule模块依赖到我们的项目模块中。
 [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));  }); }}
  • LightweightAbpModuleConfigureServices方法中配置数据库访问:
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 InitialCreatedotnet ef database update
  • 创建IBookAppServiceBookAppService:
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页面上插入数据:

CreateBook

这里我们实现了简单的数据插入。可以看到,项目中并没有使用复杂架构和复杂的领域驱动设计,仅引用并配置Abp模块,即可使用常规的 ASP.NET Core Web API方式进行开发。

......

原文转载:http://www.shaoqun.com/a/892253.html

跨境电商:https://www.ikjzd.com/

大森林:https://www.ikjzd.com/w/2268

FEN:https://www.ikjzd.com/w/2668

usps国际快递查询:https://www.ikjzd.com/w/513


本文首发于个人博客(https://blog.zhangchi.fun/)在进行框架的选型时,经常会听到"***框架太重了"之类的声音,比如"Abp太重了,不适合我们..."。事实上,Abp框架真的很重吗?框架的"轻"和"重",我没有在网上找到明确的定义,通过阅读一些技术博客,大致可以把框架的"轻"和"重"通过以下几个方面进行区分:所依赖程序集的数量所实现的功能的多少上手难度及易用性"轻量级"的框
reddit:https://www.ikjzd.com/w/180
四川省旅游局赴渝洽商川渝合作事宜 :http://www.30bags.com/a/409474.html
四川省旅游协会近日公布旅游成本价防欺骗:http://www.30bags.com/a/428996.html
四川省推出"十条"措施缓解经营困难提振发展信心:http://www.30bags.com/a/434245.html
四川省推出189个文旅招商项目助力藏羌彝文化产业走廊发展:http://www.30bags.com/a/434057.html
强壮的公么征服我厨房 公又粗又长又大又深好爽:http://lady.shaoqun.com/a/247959.html
我接的黑人客人好痛苦 黑人锁住高潮也不拔出来:http://lady.shaoqun.com/a/247110.html
我和女友在教室疯狂经历 连在一起放在里面一整天:http://lady.shaoqun.com/m/a/265137.html
招生在高校旁边开酒店的推广方式有争议:http://lady.shaoqun.com/a/428527.html
为什么大学附近有那么多小旅馆?大学生不都住校园吗?:http://lady.shaoqun.com/a/428528.html
大学周边的酒店往往供不应求。他们在里面做什么?你有过难忘的经历吗?:http://lady.shaoqun.com/a/428529.html
女人给你这四个暗示是因为想和你发生关系!:http://lady.shaoqun.com/a/428530.html