이 섹션에서는 주로 도메인 레이어를 다룹니다. 먼저 ABP 아키텍처와 템플릿에서 생성된 솔루션 간에 일대일 대응이 필요합니다. 이 단계에서 작업을 단순화하기 위해 온라인에서 사용할 수 있는 코드 생성기가 있지만 초보자에게는 권장되지 않습니다.
1. 먼저 ABP 아키텍처를 살펴보겠습니다.
도메인 레이어는 비즈니스 레이어이며 모든 비즈니스의 핵심입니다. 규칙은 도메인 계층에서 수행되어야 합니다.
엔티티: 엔터티는 비즈니스 도메인의 데이터와 작업을 나타내며 실제로 이를 데이터베이스 테이블에 매핑하는 데 사용됩니다.
리포지토리(Repository): 리포지토리는 데이터 접근을 위한 데이터베이스를 운영하는데 사용됩니다. 웨어하우징 인터페이스는 도메인 계층에서 정의되는 반면, 웨어하우징 구현 클래스는 인프라 계층에서 작성되어야 합니다.
도메인 서비스: 처리된 비즈니스 규칙이 둘 이상의 엔터티에 걸쳐 있는 경우 도메인 서비스 메서드로 작성되어야 합니다.
도메인 이벤트: 도메인 레이어에서 특정 상황이 발생할 때 도메인 이벤트가 발생하고 해당 위치에서 캡처 및 처리될 수 있습니다.
작업 단위: 작업 단위는 수정된(예: 추가, 삭제, 업데이트 등) 비즈니스 개체 목록을 유지하는 데 사용되는 디자인 패턴입니다. 이러한 비즈니스 개체의 지속성 및 동시성 문제를 조정하는 역할을 담당합니다.
2. 솔루션을 다시 살펴보겠습니다
솔루션의 각 프로젝트가 어떤 레이어에 해당하는지 확인한 후 Task 엔터티를 생성하기 시작했습니다.
3. 작업 엔터티 생성
1. 도메인 레이어에 Tasks 폴더를 생성하고 ABP의 모든 엔터티 클래스를 생성합니다. IEntity 인터페이스를 구현하며 IEntity 인터페이스는 제네릭을 통해 기본 키 ID 유형을 지정하는 일반 인터페이스입니다.
Task를 생성할 때 반드시 생성 시간을 절약해야 합니다. 이 공통 기능은 감사 모듈에서 IHasCreationTime을 구현하여 달성할 수 있습니다. 코드는 TaskState 상태 열거를 정의하는
namespace LearningMpaAbp.Tasks{ public class Task : Entity, IHasCreationTime { public const int MaxTitleLength = 256; public const int MaxDescriptionLength = 64 * 1024;//64kb public long? AssignedPersonId { get; set; } [ForeignKey("AssignedPersonId")] public User AssignedPerson { get; set; } [Required] [MaxLength(MaxTitleLength)] public string Title { get; set; } [Required] [MaxLength(MaxDescriptionLength)] public string Description { get; set; } public TaskState State { get; set; } public DateTime CreationTime { get; set; } public Task() { CreationTime = Clock.Now; State = TaskState.Open; ; } public Task(string title, string description = null) : this() { Title = title; Description = description; } } public enum TaskState : byte { Open = 0, Completed = 1 }}입니다. 그리고 특정 사용자에게 할당된 작업을 저장하기 위해 AssignedPerson 탐색 속성을 추가했습니다. [필수] 및 [최대 길이] 기능은 입력 확인에 사용됩니다. 3. 엔터티를 정의한 후 Code First 데이터 마이그레이션을 적용하려면 DbContext에서 해당 엔터티에 해당하는 DbSet을 정의해야 합니다. 기본 서비스 계층, 즉 EntityFramework로 끝나는 프로젝트에서 DbContext 클래스를 찾아 다음 코드
//TODO: Define an IDbSet for your Entities... public IDbSet<Task> Tasks { get; set; }를 추가합니다. 4. Code First 데이터 마이그레이션을 수행합니다. 패키지 관리자 콘솔을 열고 Entityframework에 해당하는 프로젝트를 기본 프로젝트로 선택합니다. Add-Migration Add_Task_Entity를 실행하여 마이그레이션을 생성합니다. 성공적으로 생성되면 Migrations 폴더에 time_Add_Task_Entity 형식의 클래스 파일이 생성됩니다. 주의 깊게 살펴보면 Migrations 폴더 아래에 SeedData 폴더가 있다는 것을 알 수 있습니다. 이름에서 알 수 있듯이 이 폴더의 클래스는 주로 시드 데이터를 사전 설정하는 데 사용됩니다. 기존 클래스의 작성 방법을 참조하여 두 개의 Task를 미리 설정할 수 있습니다. 다음 코드를 사용하여 DefaultTestDataForTask 클래스를 만듭니다.
namespace LearningMpaAbp.Migrations.SeedData{public class DefaultTestDataForTask{ private readonly LearningMpaAbpDbContext _context; private static readonly List<Task> _tasks; public DefaultTestDataForTask(LearningMpaAbpDbContext context) { _context = context; } static DefaultTestDataForTask() { _tasks = new List<Task>() { new Task("Learning ABP deom", "Learning how to use abp framework to build a MPA application."), new Task("Make Lunch", "Cook 2 dishs") }; } public void Create() { foreach (var task in _tasks) { _context.Tasks.Add(task); _context.SaveChanges(); } } } }그런 다음 Configuration 클래스의 Seed 메서드에 다음 코드를 추가합니다.
new DefaultTestDataForTask(context).Create();패키지 관리자 콘솔에서 Update-Database를 입력하고 Enter 키를 눌러 마이그레이션을 수행합니다. 실행이 성공한 후 데이터베이스를 확인하여 Tasks 테이블이 성공적으로 생성되었으며 두 개의 테스트 데이터가 테이블에 이미 존재하는지 확인합니다. 이 시점에서 Task 엔터티 클래스가 성공적으로 생성되었습니다.
참고용으로 소스 코드가 Github-LearningMpaAbp에 업로드되었습니다.
ABP 입문 시리즈 카탈로그 - Abp 프레임워크 학습을 위한 실습