dedsiddd-dotnet-coding
10
总安装量
6
周安装量
#30094
全站排名
安装命令
npx skills add https://github.com/dedsiteam/dedsi-skills --skill dedsiddd-dotnet-coding
Agent 安装分布
claude-code
5
opencode
4
antigravity
4
windsurf
3
codex
3
Skill 文档
èå´ä¸ç®æ
æ¬ Skill ç¨äºå¨ DedsiDDD + .NET 项ç®ä¸çæå¯ç¼è¯ãå¯è½å°ç代ç 骨æ¶ã
å²çªä¼å çº§ï¼æ¬ SKILL çº¦å® > ç°æä»åºçº¦å® > ä¸è¬ DDD/CQRS ä¹ æ¯ã
交äºåè®®ï¼å¼ºå¶ï¼
- ä¿¡æ¯ä¸è¶³å é®ï¼è§”æ¾æ¸ é®é¢æ¸ å”ï¼
- æ¹é 代ç ç»”æå°è¡¥ä¸”
- ææä»¶åç»è¾åº
- å ä½ç¬¦
[Project]/[Entity]/[DbContext]å¿ é¡»æ¿æ¢ä¸ºå®é å½å - ä¾èµæ¹åä¸å¯ç ´å
è¾å ¥ä¸è¾åº
æ¾æ¸ é®é¢æ¸ å
- 模åè¾¹çï¼å®ä½å±äºåªä¸ªæ¨¡åï¼å½å空é´ä¸ç®å½ï¼
- è·¯ç±é£æ ¼ï¼Controller ä½¿ç¨ action route è¿æ¯èµæºè·¯ç±ï¼
- èåä¿¡æ¯ï¼å®ä½å/夿°åã主é®ç±»åï¼é»è®¤ string/ULIDï¼ãæ¯å¦èåæ ¹
- åæ®µæ¸ åï¼å段å/ç±»å/å¿ å¡«/é¿åº¦/é»è®¤å¼/enum/å¼å¯¹è±¡
- å ³ç³»ä¸éåï¼ä¸å¯¹å¤/å¤å¯¹å¤ãéåå¯ä¸æ§çº¦æãæ´æ°çç¥ï¼å¢é vs Clear+Addï¼
- æ°æ®åºæ å°ï¼è¡¨åãSchemaãç´¢å¼/å¯ä¸çº¦æãæ¯å¦è½¯å
- API å¥çº¦ï¼éè¦åªäºç«¯ç¹ï¼Get/Paged/Create/Update/Delete/Exportï¼
- è¿åç»æï¼æ¯å¦æç»ä¸ç ApiResponse/Result å è£ ï¼
缺ççç¥
- 主é®ï¼é»è®¤
stringï¼çææ¹å¼Ulid.NewUlid().ToString() - å页ï¼ä½¿ç¨
DedsiPagedRequestDto - æ´æ°éåï¼é»è®¤ Clear + Add
- 导åºç»ä»¶ï¼ä» å½ä»åºå·²åå¨ MiniExcel æ¶æä¾è½å°ä»£ç
äº¤ä»æ å
- æç¡®çæä»¶æ¸ åä¸è½ç¹ï¼Domain/Infrastructure/UseCase/HttpApiï¼
- æ¯ä¸ªæä»¶çä»£ç æ¨¡æ¿ææå°åæ´è¡¥ä¸
- ææå
¬å¼å
¥å£å
å«
CancellationTokenå¹¶éä¼ å° EF Core/ä»å¨ - å页æ¥è¯¢é¡ºåºï¼çé â Count â æåº âï¼é导åºåå页ï¼â æå½± â ToList
- Controller è½ç¼è¯å¹¶è½è°ç¨ Query/Mediatorï¼Command/Query è¿åç±»åä¸ Controller 对é½
项ç®ç»æ
æ¶æåå±
- é¢åï¼
src/[Project].Domainï¼ï¼æ ¸å¿é¢å对象ã常éãé¢å模å - åºç¡è®¾æ½ï¼
src/[Project].Infrastructureï¼ï¼EF Core æä¹ åãDbContextãå®ä½æ å°ãä»å¨ - ç¨ä¾ï¼
src/[Project].UseCaseï¼ï¼CQRS å½ä»¤/æ¥è¯¢ä¸ç¼æ - HttpApiï¼
src/[Project].HttpApiï¼ï¼æ´é²æ§å¶å¨ - 宿主ï¼
host/[Project].Hostï¼ï¼ASP.NET Core Web 宿主
ä¾èµå ³ç³»
[Project].Host â [Project].HttpApi â [Project].UseCase â [Project].Domain
â
[Project].Infrastructure â [Project].Domain
åæ¾ä½ç½®éæ¥
| çæå | æ¾ç½®é¡¹ç® | ç®å½ | å ¸åæä»¶ |
|---|---|---|---|
| é¢å模å | src/[Project].Domain |
[Entities]/ |
[Entity].cs |
| DTO | src/[Project].UseCase |
[Entities]/Dtos/ |
[Entity]Dto.cs / [Entity]CreateUpdateDto.cs |
| DbContext | src/[Project].Infrastructure |
EntityFrameworkCore/ |
[Project]DbContext.cs |
| EF Core æ å° | src/[Project].Infrastructure |
EntityFrameworkCore/EntityConfigurations/ |
[Entity]Configuration.cs |
| ä»å¨ | src/[Project].Infrastructure |
Repositories/ |
[Entity]Repository.cs |
| Commands | src/[Project].UseCase |
[Entities]/CommandHandlers/ |
Create[Entity]CommandHandler.cs |
| Queries | src/[Project].UseCase |
[Entities]/Queries/ |
[Entity]Query.cs / [Entity]PagedQuery.cs |
| Controller | src/[Project].HttpApi |
é项ç®ç°æç»ç» | [Entity]Controller.cs |
æå°äº¤ä»æ¸ å
- Domainï¼
[Entity].cs - Infrastructureï¼
[Project]DbContext.cså¢åDbSet<[Entity]>ã[Entity]Configuration.csã[Entity]Repository.cs - UseCaseï¼DTOãCommand/Query
- HttpApiï¼Controller + Requestsï¼æ¨èï¼
éç¨çº¦å®
- å ä½ç¬¦ï¼
[Entity]/[Project]/[DbContext]æå®é ä¸å¡æ¿æ¢ - æä»¶èåååï¼Command/Handler åæä»¶ï¼Query æ¥å£/å®ç°åæä»¶ï¼Repository æ¥å£/å®ç°åæä»¶
- Enum 约æï¼ææ
enumå¿ é¡»æ¾å¼èµå¼ï¼ç¬¬ä¸ä¸ªä¸å¡å¼ä»1å¼å§ - CancellationTokenï¼ææå ¬å¼ API/Query/Command å¿ é¡»æ¥æ¶å¹¶éä¼ å° EF Core/ä»å¨
- XML 注éï¼ControllerãQuery æ¥å£/å®ç°ãDTO å¿
é¡»æ XML 注éï¼å®ç°ç±»å¯ç¨
/// <inheritdoc />
æ¨è工使µ
- æ¾æ¸ è¾¹çä¸ä¸åå¼
- åé¢å模åï¼Domainï¼
- å®ä¹ DTOï¼Contractï¼
- é ç½® EF Coreï¼DbContext + EntityConfigurationï¼
- çæä»å¨ï¼Repositoryï¼
- å®ç° Commandsï¼åä¾§ï¼
- å®ç° Queriesï¼è¯»ä¾§ï¼
- å®ç° Controllerï¼API å±ï¼
- ä¸è´æ§æ£æ¥
çæé¢å模å
è§å
- èåæ ¹ç»§æ¿
DedsiAggregateRoot<string> - å¿
é¡»å
å«
protectedæ åæé 彿°ï¼ä¾ ORMï¼ - 屿§ä½¿ç¨
private set - ç¶æåæ´éè¿èåæ ¹æ¹æ³ï¼
Change+屿§åãAdd+å ç´ åãRemove+å ç´ åãClear+éåå - å
¥åæ ¡éªï¼å符串
Check.NotNullOrWhiteSpaceï¼å¼ç¨ç±»åCheck.NotNullï¼æä¸¾å¼åæ³æ§æ£æ¥ - å¹çæ§ï¼æ°æ§å¼ç¸åç´æ¥è¿å
- ç»´æ¤ä¸åå¼ï¼ä¸æ»¡è¶³æ¶æ
BusinessException
模æ¿
using Volo.Abp;
using Dedsi.Ddd.Domain.Entities;
/// <summary>
/// [Entity]
/// </summary>
public class [Entity] : DedsiAggregateRoot<string>
{
protected [Entity]() { }
public [Entity](string id, string requiredField)
: base(id)
{
ChangeRequiredField(requiredField);
CreationTime = DateTime.Now;
}
public DateTime CreationTime { get; private set; }
/// <summary>
/// ä¸ææ³¨é
/// </summary>
public string RequiredField { get; private set; }
public void ChangeRequiredField(string value)
{
RequiredField = Check.NotNullOrWhiteSpace(value, nameof(RequiredField));
}
public ICollection<[Child]> Children { get; private set; } = [];
public void AddChild([Child] child)
{
Children.Add(Check.NotNull(child, nameof([Child])));
}
public void ClearChildren()
{
Children.Clear();
}
}
/// <summary>
/// [Entity]
/// </summary>
public class [Child]
{
public string [Entity]Id { get; private set; }
protected [Child]() { }
public [Child](string id, string requiredField)
: base(id)
{
ChangeRequiredField(requiredField);
}
/// <summary>
/// ä¸ææ³¨é
/// </summary>
public string RequiredField { get; private set; }
public void ChangeRequiredField(string value)
{
RequiredField = Check.NotNullOrWhiteSpace(value, nameof(value));
}
}
çæ DTO
è§å
- å±ç¤º DTOï¼
[Entity]Dtoï¼ä½¿ç¨public get; set; - å建/æ´æ° DTOï¼
[Entity]CreateUpdateDtoï¼ä½¿ç¨public get; set; - æ¯ä¸ªå段/屿§å¿ é¡»æ XML 注é
- DTO ä¸ç´æ¥æ´é²é¢å对象类åï¼ä¸ºéå/å¤æå¯¹è±¡åç¬å®ä¹ DTOï¼
模æ¿
/// <summary>
/// [Entity]Dto
/// </summary>
public class [Entity]Dto
{
/// <summary>
/// æ è¯
/// </summary>
public string Id { get; set; }
/// <summary>
/// å建æ¶é´
/// </summary>
public DateTime CreationTime { get; set; }
/// <summary>
/// å¿
å¡«åæ®µ
/// </summary>
public string RequiredField { get; set; }
/// <summary>
/// å¯ç©ºå段
/// </summary>
public string? OptionalField { get; set; }
/// <summary>
/// åè¡¨åæ®µ
/// </summary>
public IEnumerable<[Child]Dto> Children { get; set; } = [];
}
/// <summary>
/// [Entity]CreateUpdateDto
/// </summary>
public class [Entity]CreateUpdateDto
{
/// <summary>
/// å¿
å¡«åæ®µ
/// </summary>
public string RequiredField { get; set; }
/// <summary>
/// å¯ç©ºå段
/// </summary>
public string? OptionalField { get; set; }
/// <summary>
/// åè¡¨åæ®µ
/// </summary>
public IEnumerable<[Child]CreateUpdateDto> Children { get; set; } = [];
}
/// <summary>
/// [Entity]PagedInputDto
/// </summary>
public class [Entity]PagedInputDto : DedsiPagedRequestDto
{
/// <summary>
/// å
³é®å
/// </summary>
public string? Keyword { get; set; }
}
/// <summary>
/// [Entity]PagedRowDto
/// </summary>
public class [Entity]PagedRowDto
{
/// <summary>
/// 主é®
/// </summary>
public string Id { get; set; } = default!;
/// <summary>
/// 示ä¾å段
/// </summary>
public string? Example { get; set; }
}
/// <summary>
/// [Entity]PagedResultDto
/// </summary>
public class [Entity]PagedResultDto : DedsiPagedResultDto<[Entity]PagedRowDto>;
é ç½®æ°æ®åº
DbContext è§å
- å½åï¼èåæ ¹å¤æ°å½¢å¼ï¼ä¾å¦
Risksï¼ - ç±»åï¼
DbSet<èåæ ¹> - ä½ç½®ï¼
I[Project]DbContext/[Project]DbContext - æ æ³¨ï¼
[ConnectionStringName([Project]DomainConsts.ConnectionStringName)] - æ¥å£ï¼
I[Project]DbContext : IDedsiEfCoreDbContext - å®ç°ï¼
[Project]DbContext : DedsiEfCoreDbContext<[Project]DbContext>, I[Project]DbContext - OnModelCreatingï¼ç©ºå¼æ ¡éª â
ApplyConfigurationsFromAssemblyâbase.OnModelCreating
EntityConfiguration è§å
- æ¯ä¸ªå®ä½ä¸ä¸ªé
置类ï¼
[Entity]Configurationï¼æ¾å¨EntityFrameworkCore/EntityConfigurations internal classï¼å®ç°IEntityTypeConfiguration<[EntityName]>
模æ¿
// DbContext
using Dedsi.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore;
using Volo.Abp.Data;
namespace [Project].Infrastructure.EntityFrameworkCore;
[ConnectionStringName([Project]DomainConsts.ConnectionStringName)]
public interface I[Project]DbContext : IDedsiEfCoreDbContext
{
DbSet<[Entity]> [Entities] { get; }
}
[ConnectionStringName([Project]DomainConsts.ConnectionStringName)]
public class [Project]DbContext(DbContextOptions<[Project]DbContext> options)
: DedsiEfCoreDbContext<[Project]DbContext>(options), I[Project]DbContext
{
public DbSet<[Entity]> [Entities] { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
ArgumentNullException.ThrowIfNull(modelBuilder);
modelBuilder.ApplyConfigurationsFromAssembly(typeof([Project]DbContext).Assembly);
base.OnModelCreating(modelBuilder);
}
}
// EntityConfiguration
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
namespace [Project].Infrastructure.EntityFrameworkCore.EntityConfigurations;
internal class [Entity]Configuration : IEntityTypeConfiguration<[Entity]>
{
public void Configure(EntityTypeBuilder<[Entity]> builder)
{
builder.ToTable("[Entities]", [Project]DomainConsts.DbSchemaName);
builder.HasKey(e => e.Id);
builder.Property(e => e.RequiredField)
.IsRequired()
.HasMaxLength(128);
}
}
çæä»å¨
è§å
- æ¥å£ï¼
I[Entity]Repository : IDedsiCqrsRepository<[Entity], KeyType> - å®ç°ï¼
[Entity]Repository : DedsiDddEfCoreRepository<DbContext, [Entity], KeyType> - æ¥å£åå®ç°å¿ é¡»å¨åä¸ä¸ªæä»¶ä¸
- æé 彿°æ³¨å
¥
IDbContextProvider<DbContext>
模æ¿
using Dedsi.Ddd.Domain.Repositories;
using Dedsi.EntityFrameworkCore.Repositories;
using Volo.Abp.EntityFrameworkCore;
using [Project].Infrastructure.EntityFrameworkCore;
namespace [Project].Infrastructure.Repositories;
/// <summary>
/// [Entity] ä»å¨
/// </summary>
public interface I[Entity]Repository : IDedsiCqrsRepository<[Entity], string>;
/// <summary>
/// [Entity] ä»å¨
/// </summary>
public class [Entity]Repository(IDbContextProvider<[Project]DbContext> dbContextProvider)
: DedsiDddEfCoreRepository<[Project]DbContext, [Entity], string>(dbContextProvider), I[Entity]Repository;
çæå½ä»¤ (Commands)
è§å
- Create/Update/Delete æå为ä¸ä¸ªç¬ç«æä»¶
- Command ä¸ Handler å¿ é¡»å¨åæä»¶
- ç»§æ¿
DedsiCommandHandler<Command, Result> - å
¨é¾è·¯éä¼
CancellationToken
模æ¿
// Create
using Dedsi.Ddd.CQRS.CommandHandlers;
using Dedsi.Ddd.CQRS.Commands;
/// <summary>
/// å建 [Entity] å½ä»¤
/// </summary>
public record Create[Entity]Command([Entity]CreateUpdateDto Dto) : DedsiCommand<string>;
/// <summary>
/// å建 [Entity] å½ä»¤å¤çå¨
/// </summary>
public class Create[Entity]CommandHandler(I[Entity]Repository repository)
: DedsiCommandHandler<Create[Entity]Command, string>
{
public override async Task<string> Handle(Create[Entity]Command command, CancellationToken cancellationToken)
{
var domainId = Ulid.NewUlid().ToString();
var domain = new [Entity](domainId, command.Dto.RequiredField);
await repository.InsertAsync(domain, autoSave: true, cancellationToken);
return domainId;
}
}
/// <summary>
/// æ´æ° [Entity] å½ä»¤
/// </summary>
public record Update[Entity]Command(string Id, [Entity]CreateUpdateDto Dto) : DedsiCommand<bool>;
/// <summary>
/// æ´æ° [Entity] å½ä»¤å¤çå¨
/// </summary>
public class Update[Entity]CommandHandler(I[Entity]Repository repository)
: DedsiCommandHandler<Update[Entity]Command, bool>
{
public override async Task<bool> Handle(Update[Entity]Command command, CancellationToken cancellationToken)
{
var domain = await repository.GetAsync(e => e.Id == command.Id, true, cancellationToken);
domain.ChangeRequiredField(command.Dto.RequiredField);
await repository.UpdateAsync(domain, autoSave: true, cancellationToken);
return true;
}
}
// Delete
/// <summary>
/// å é¤ [Entity] å½ä»¤
/// </summary>
public record Delete[Entity]Command(string Id) : DedsiCommand<bool>;
/// <summary>
/// å é¤ [Entity] å½ä»¤å¤çå¨
/// </summary>
public class Delete[Entity]CommandHandler(I[Entity]Repository repository)
: DedsiCommandHandler<Delete[Entity]Command, bool>
{
public override async Task<bool> Handle(Delete[Entity]Command command, CancellationToken cancellationToken)
{
var domain = await repository.GetAsync(command.Id, true, cancellationToken);
await repository.DeleteAsync(domain, true, cancellationToken);
return true;
}
}
çææ¥è¯¢ (Queries)
è§å
- æ¥å£ä¸å®ç°åæä»¶
- æ¥è¯¢æ³¨å ¥ DbContext æ¥å£
- å页æ¥è¯¢å¿
é¡»
AsNoTracking() - åºå®é¡ºåºï¼çé â Count â æåº âï¼é导åºåå页ï¼â æå½± â ToList
idå ¥åå¿ é¡»ç¨äºè°è¯- Query æ¥å£/å®ç°/æ¹æ³å¿ é¡»æ XML 注é
模æ¿
å页æ¥è¯¢
using Dedsi.Ddd.Application.Contracts.Dtos;
using Dedsi.Ddd.Domain.Queries;
using Microsoft.EntityFrameworkCore;
using Volo.Abp.Linq;
/// <summary>
/// [Entity] å页æ¥è¯¢
/// </summary>
/// <param name="[Project]DbContext"></param>
public class [Entity]PagedQuery(I[Project]DbContext [Project]DbContext) : IDedsiQuery
{
/// <summary>
/// [Entity] å页æ¡ä»¶æ¥è¯¢
/// </summary>
/// <param name="input"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
public async Task<[Entity]PagedResultDto> PagedQueryAsync([Entity]PagedInputDto input, CancellationToken cancellationToken)
{
var query = [Project]DbContext
.[Entities]
.AsNoTracking()
.WhereIf(!string.IsNullOrWhiteSpace(input.Keyword), e => e.RequiredField.Contains(input.Keyword!));
var totalCount = await query.CountAsync(cancellationToken);
query = query.OrderByDescending(e => e.CreationTime);
if (!input.IsExport)
{
query = query.PageBy(input.GetSkipCount(), input.PageSize);
}
var items = await query
.Select(e => new [Entity]PagedRowDto { Id = e.Id, Example = e.RequiredField })
.ToListAsync(cancellationToken);
return new [Entity]PagedResultDto { TotalCount = totalCount, Items = items };
}
}
å个æ¥è¯¢
using Dedsi.Ddd.Domain.Queries;
/// <summary>
/// [Entity] æ¥è¯¢
/// </summary>
/// <param name="dbContext"></param>
/// <param name="repository"></param>
public class [Entity]Query(
I[Project]DbContext [Project]DbContext,
I[Entity]Repository [Entity]Repository) : IDedsiQuery
{
/// <summary>
/// è·å详æ
/// </summary>
/// <param name="id"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
public async Task<[Entity]Dto> GetAsync(string id, CancellationToken cancellationToken)
{
var domain = await [Entity]Repository.GetAsync(e => e.Id == id, true, cancellationToken);
return new [Entity]Dto
{
Id = domain.Id,
CreationTime = domain.CreationTime,
RequiredField = domain.RequiredField,
OptionalField = domain.OptionalField,
Children = domain.Children.Select(c => new [Child]Dto { /* åæ®µæ å° */ })
};
}
}
çææ§å¶å¨ (Controller)
è§å
- ç»§æ¿é¡¹ç®åºç¡æ§å¶å¨
- 注å
¥
I[Entity]QueryãI[Entity]PagedQueryãIDedsiMediator CancellationToken使ç¨HttpContext.RequestAborted- è·¯ç±é£æ ¼è·éä»åºç°æ Controller
- Update Body 使ç¨
CreateUpdateDtoï¼åå ¥å¥çº¦ï¼ï¼ä¸ä½¿ç¨Dtoï¼å±ç¤ºå¥çº¦ï¼ - 导åºï¼ä» å½ä»åºå·²å¼ç¨ MiniExcel æ¶è½å°ä»£ç
Request 模åï¼æ¨èï¼
/// <summary>
/// å建请æ±å¯¹è±¡
/// </summary>
public record Create[Entity]Request([Entity]CreateUpdateDto [Entity]);
/// <summary>
/// ä¿®æ¹è¯·æ±å¯¹è±¡
/// </summary>
public record Update[Entity]Request([Entity]CreateUpdateDto [Entity]);
模æ¿
using Dedsi.Ddd.CQRS.Mediators;
using Microsoft.AspNetCore.Mvc;
using MiniExcelLibs;
using MiniExcelLibs.OpenXml;
/// <summary>
/// [Entity]
/// </summary>
public class [Entity]Controller(
[Entity]Query [Entity]Query,
[Entity]PagedQuery [Entity]PagedQuery,
IDedsiMediator dedsiMediator) : [Project]Controller
{
/// <summary>
/// å页æ¥è¯¢
/// </summary>
[HttpPost]
public Task<[Entity]PagedResultDto> PagedQueryAsync([FromBody] [Entity]PagedInputDto input)
{
input.IsExport = false;
return [Entity]PagedQuery.PagedQueryAsync(input, HttpContext.RequestAborted);
}
/// <summary>
/// å¯¼åº Excel
/// </summary>
[HttpPost("export")]
public async Task<IActionResult> ExportExcelAsync([FromBody] [Entity]PagedInputDto input)
{
input.IsExport = true;
var result = await [Entity]PagedQuery.PagedQueryAsync(input, HttpContext.RequestAborted);
var stream = new MemoryStream();
await stream.SaveAsAsync(result.Items, cancellationToken: HttpContext.RequestAborted);
stream.Seek(0, SeekOrigin.Begin);
return File(
stream,
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
$"[Entity]-{DateTime.Now:yyyyMMddHHmmss}.xlsx"
);
}
/// <summary>
/// æ¥è¯¢è¯¦æ
/// </summary>
[HttpGet("{id}")]
public Task<[Entity]Dto> GetAsync([FromRoute] string id)
=> [Entity]Query.GetAsync(id, HttpContext.RequestAborted);
/// <summary>
/// å建
/// </summary>
[HttpPost]
public Task<string> CreateAsync([FromBody] Create[Entity]Request request)
=> dedsiMediator.SendAsync(new Create[Entity]Command(request.[Entity]), HttpContext.RequestAborted);
/// <summary>
/// ä¿®æ¹
/// </summary>
[HttpPost("{id}")]
public Task<bool> UpdateAsync([FromRoute] string id, [FromBody] Update[Entity]Request request)
=> dedsiMediator.SendAsync(new Update[Entity]Command(id, request.[Entity]), HttpContext.RequestAborted);
/// <summary>
/// å é¤
/// </summary>
[HttpPost("{id}")]
public Task<bool> DeleteAsync([FromRoute] string id)
=> dedsiMediator.SendAsync(new Delete[Entity]Command(id), HttpContext.RequestAborted);
}
/// <summary>
/// å建请æ±å¯¹è±¡
/// </summary>
public record Create[Entity]Request([Entity]CreateUpdateDto [Entity]);
/// <summary>
/// ä¿®æ¹è¯·æ±å¯¹è±¡
/// </summary>
public record Update[Entity]Request([Entity]CreateUpdateDto [Entity]);
常è§åä¸éªæ¶æ¸ å
常è§å
- Update ç«¯ç¹ Body 误ç¨å±ç¤º
Dtoï¼å¿ é¡»ç¨CreateUpdateDto - Query å¿è®°
AsNoTracking() - å页顺åºé误ï¼å¿ é¡»”çé â Count â æåº âï¼é导åºåå页ï¼â æå½± â ToList”
CancellationTokenæé¾idå ¥åæªç¨äºè°è¯- enum æªæ¾å¼èµå¼
éªæ¶æ¸ å
- æä»¶è½ç¹ä¸ä¾èµæ¹åæ£ç¡®
- Command/HandlerãQuery æ¥å£/å®ç°ãRepository æ¥å£/å®ç°ååæä»¶
- Controller/Query/Command æ¾å¼æ¥æ¶å¹¶éä¼
CancellationToken - Create/Update/Delete çè¿åç±»åä¸ Command è¿åç±»åä¸è´
- Update/Delete è·¯ç±ä¸å²çª
- PagedQuery æ¯æå¯¼åºæ¨¡å¼
- Create/Update ç Body 使ç¨
CreateUpdateDto - å页æ¥è¯¢å®ç°é¡ºåºæ£ç¡®