因好多群友@我說,ABP他們簡單的了解了下,按照官方的教程一路下來跑不起來(倒在了入門的門口),才有了此文,
此文結合官方檔案,一步一步帶領大家讓ABP跑起來(跨過門口),
建議大家一步一步實際動手操作下
一、Abp 簡介
ABP是用于創建現代Web應用程式的完整架構和強大的基礎設施! 遵循最佳實踐和約定,為你提供SOLID開發經驗.
ABP 是一個開源應用程式框架,專注于基于ASP.NET Core的Web應用程式開發,但也支持開發其他型別的應用程式.
二、專案創建
作為入門,這里就不使用CLI創建了,使用在線創建專案,在線地址:https://abp.io/get-started,為了演示,專案名稱就用官方的Acme.BookStore
下載完解壓后,使用VS2019 打開后
下面我將帶領大家搭建一個簡單的CURD,并簡單的帶大家認識它的分層及各層是干啥的,
三、開發教程
3.1、在 Acme.BookStore.Domain.Share 層下創建 BookType 列舉
public enum BookType
{
Undefined,
Adventure,
Biography,
Dystopia,
Fantastic,
Horror,
Science,
ScienceFiction,
Poetry
}
3.2、在 Acme.BookStore.Domain 層下創建Book物體
public class Book : AuditedAggregateRoot<Guid>
{
public string Name { get; set; }
public BookType Type { get; set; }
public DateTime PublishDate { get; set; }
public float Price { get; set; }
}
3.3、在 Acme.BookStore.EntityFrameworkCore 層下的 BookStoreDbContext 類中將 Book 物體加入
[ConnectionStringName("Default")]
public class BookStoreDbContext : AbpDbContext<BookStoreDbContext>
{
public DbSet<AppUser> Users { get; set; }
public DbSet<Book> Books { get; set; }
}
3.4、將 Book 物體映射到資料庫表中
在 Acme.BookStore.EntityFrameworkCore 層下的 BookStoreDbContextModelCreatingExtensions 類中的 ConfigureBookStore 方法中添加 Book 物體的映射檔案
public static class BookStoreDbContextModelCreatingExtensions
{
public static void ConfigureBookStore(this ModelBuilder builder)
{
Check.NotNull(builder, nameof(builder));
builder.Entity<Book>(b =>
{
b.ToTable(BookStoreConsts.DbTablePrefix + "Books", BookStoreConsts.DbSchema);
b.ConfigureByConvention();
b.Property(x => x.Name).IsRequired().HasMaxLength(128);
});
}
}
3.5、資料遷移
- 打開 程式包管理器控制臺(PMC)
- 選擇 Acme.BookStore.EntityFrameworkCore.DbMigrations 作為默認專案并使用 Add-Migraction 命令遷移專案 成功后會創建一個遷移類
3.6、添加種子資料(可選)
在 Acme.BookStore.Domain 層下創建 BookStoreDataSeederContributor 類
public class BookStoreDataSeederContributor : IDataSeedContributor, ITransientDependency
{
private readonly IRepository<Book, Guid> _bookRepository;
public BookStoreDataSeederContributor(IRepository<Book, Guid> bookRepository)
{
_bookRepository = bookRepository;
}
public async Task SeedAsync(DataSeedContext context)
{
if (await _bookRepository.GetCountAsync() <= 0)
{
await _bookRepository.InsertAsync(new Book
{
Name = "1984",
Type = BookType.Dystopia,
PublishDate = new DateTime(1949, 6, 8),
Price = 19.84f
},
autoSave: true);
await _bookRepository.InsertAsync(
new Book
{
Name = "The Hitchhiker's Guide to the Galaxy",
Type = BookType.ScienceFiction,
PublishDate = new DateTime(1995, 9, 27),
Price = 42.0f
},
autoSave: true
);
}
}
}
3.7、更新資料庫
將 Acme.BookStore.DbMigrator 設為啟動專案,并更改它下面的 appsettings.json 檔案
更改 appsettings.json 檔案中的資料庫連接字串(這里我使用VS自帶的SqlServer資料庫),
3.7.1、視圖 —> SQL Server物件資源管理器
3.7.2、創建資料庫 BootStore
3.7.3、獲取連接字串
3.7.4、更改 appsettings.json ,將上一步復制的資料庫連接字串替換到 ConnectionString->Default 的 值中
3.7.5、F5運行專案
3.8、在 Acme.BookStore.Application.Contracts 層下創建 BookDto 類及CreateUpdateBookDto型別,并使用 AutoMapper 將 Book 物體轉成 BookDto 物件,將CreateUpdateBookDto物件轉成Book物體的映射
public class BookDto : AuditedEntityDto<Guid>
{
public string Name { get; set; }
public BookType Type { get; set; }
public DateTime PublishDate { get; set; }
public float Price { get; set; }
}
public class CreateUpdateBookDto
{
[Required]
[StringLength(128)]
public string Name { get; set; }
[Required]
public BookType Type { get; set; } = BookType.Undefined;
[Required]
[DataType(DataType.Date)]
public DateTime PublishDate { get; set; } = DateTime.Now;
[Required]
public float Price { get; set; }
}
在 Acme.BookStore.Application 層下的 BookStoreApplicationAutoMapperProfile 類中將 Book 物體轉成 BookDto 物件
namespace Acme.BookStore
{
public class BookStoreApplicationAutoMapperProfile : Profile
{
public BookStoreApplicationAutoMapperProfile()
{
/* You can configure your AutoMapper mapping configuration here.
* Alternatively, you can split your mapping configurations
* into multiple profile classes for a better organization. */
CreateMap<Book, BookDto>();
CreateMap<CreateUpdateBookDto, Book>();
}
}
}
3.9、創建 IBookAppService 介面 及它的實作類 BookAppService
在 Acme.BookStore.Application.Contracts 專案下 添加 IBookAppService 介面
namespace Acme.BookStore
{
public interface IBookAppService :
ICrudAppService<//定義CRUD方法
BookDto,//用來展示
Guid,//主鍵型別
PagedAndSortedResultRequestDto,//用于分頁和排序
CreateUpdateBookDto,//用于創建
CreateUpdateBookDto//用于更新
>
{
}
}
在 Acme.BookStore.Application 專案下添加 BookAppService 類
namespace Acme.BookStore
{
public class BookAppService :
CrudAppService<
Book,
BookDto,
Guid,
PagedAndSortedResultRequestDto,
CreateUpdateBookDto,
CreateUpdateBookDto>, IBookAppService
{
public BookAppService(IRepository<Book, Guid> repository)
: base(repository)
{
}
}
}
3.10、設定 Acme.BookStore.HttpApi.Host 為啟動專案,并修改它的 appsettings.json 檔案并運行
3.10.1、設定 appsettings.json 設定方式同 3.7.4
3.10.2 運行專案
是不是非常奇怪,通常我們需要創建Controller以將應用程式服務公開為HTTP API端點,而ABP可以自動按照約定(慣例)將應用程式服務配置為MVC API控制器并使用 Swagger 來管理API檔案,是不是很酷,我們沒有撰寫任何代碼來創建API控制器,但是現在我們有了一個可以正常使用的REST API!
四、ABP分層
4.1、Domain
Domain(領域) 劃分為兩個專案,Domain.Share 和 Domain
Domain.Share :包含常量,列舉和其他型別, 它不能包含物體,存盤庫,域服務或任何其他業務物件. 可以安全地與模塊中的所有層使用. 此包也可以與第三方客戶端使用.
Domain: 包含物體, 倉儲介面,領域服務介面及其實作和其他領域物件. Domain 包依賴于 Domain.Shared 包.
4.2、Application
Application(應用服務) 劃分為兩個專案 Application.Contracts 和 Application
Application.Contracts:包含應用服務介面和相關的資料傳輸物件(DTO). Application contract 包依賴于 Domain.Shared 包
Application:包含應用服務實作. Application 包依賴于 Domain 包和 Application.Contracts 包
4.3、Infrastructure
Infrastructure(基礎設施) 為每個orm/資料庫集成創建一個獨立的集成包, 比如Entity Framework Core 和 MongoDB.
4.4、HTTP
- 為模塊開發REST風格的HTTP API,
- 為每個應用服務創建一個Controller (通常通過實作其介面). 這些控制器使用應用服務介面來委托操作. 它根據需要配置路由, HTTP方法和其他與Web相關的東西.
- HTTP API 包只依賴于 Application.Contracts 包. 不要依賴 Application 包,
- 創建一個為HTTP API包提供客戶端服務的HTTP API Client包,這些客戶端服務將應用服務介面實作遠程端點的客戶端.HTTP API Client 包僅依賴于 Application.Contracts 包 使用ABP框架提供的動態代理HTTP C#客戶端的功能.
4.5、Web
包含頁面,視圖,腳本,樣式,影像和其他UI組件,Web 包僅依賴于 HttpApi 包
ABP框架遵循DDD原則和模式去實作分層應用程式模型,該模型由四個基本層組成:
- 表示層: 為用戶提供介面. 使用應用層實作與用戶互動.
- 應用層: 表示層與領域層的中介,編排業務物件執行特定的應用程式任務. 使用應用程式邏輯實作用例.
- 領域層: 包含業務物件以及業務規則. 是應用程式的核心.
- 基礎設施層: 提供通用的技術功能,支持更高的層,主要使用第三方類別庫.
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/236842.html
標籤:.NET Core
上一篇:Nlog的使用
下一篇:C# 決議JSON字串
