리포지토리(Repository): 리포지토리는 데이터 접근을 위한 데이터베이스를 운영하는데 사용됩니다. 웨어하우징 인터페이스는 도메인 계층에서 정의되는 반면, 웨어하우징 구현 클래스는 인프라 계층에서 작성되어야 합니다.
ABP에서 웨어하우징 클래스는 동기 및 비동기 메서드를 포함하여 일반적으로 사용되는 추가, 삭제, 수정 및 집계 메서드를 정의하는 IRepository 인터페이스를 구현해야 합니다. 여기에는 주로 다음 메서드가 포함됩니다.
ABP는 EntityFramework에 대해
다양한 ORM 프레임워크에 대해 이 인터페이스의 기본 구현을 제공합니다. EfRepositoryBase
NHibernate의 경우 NhRepositoryBase
일반 버전의 구현은 대부분의 경우 이러한 방법이 일반 엔터티의 요구를 충족하기에 충분하다는 것을 의미합니다. 이러한 메서드가 엔터티에 충분하다면 이 엔터티에 필요한 저장소 인터페이스/클래스를 만들 필요가 없습니다.
애플리케이션 서비스 계층에서 웨어하우스 참조를 직접 정의한 후 생성자를 통해 주입할 수 있습니다. 당사 애플리케이션 서비스 레이어에서는 다음과 같은 방법으로 태스크 웨어하우징을 사용할 수 있습니다.
public class TaskAppService : ITaskAppService { private readonly IRepository<Task> _taskRepository; public TaskAppService(IRepository<Task> taskRepository) { _taskRepository = taskRepository; }
샘플 코드에서 사용한 방법입니다
2. 커스텀 웨어하우징 구현 방법
사용자에게 어떤 작업이 할당되었는지 알아내야 한다고 가정해 보겠습니다.
도메인 레이어에서 IRepositories 폴더를 생성한 후 IBackendTaskRepository를 정의합니다.
namespace LearningMpaAbp.IRepositories {/// <summary>/// 自定义仓储示例/// </summary>public interface IBackendTaskRepository : IRepository<Task> { /// <summary> /// 获取某个用户分配了哪些任务 /// </summary> /// <param name="personId">用户Id</param> /// <returns>任务列表</returns> List<Task> GetTaskByAssignedPersonId(long personId); } }
인프라 계층에서 이 웨어하우징이 구현됩니다.
namespace LearningMpaAbp.EntityFramework.Repositories {public class BackendTaskRepository:LearningMpaAbpRepositoryBase<Task>,IBackendTaskRepository{ public BackendTaskRepository(IDbContextProvider<LearningMpaAbpDbContext> dbContextProvider) : base(dbContextProvider) { } /// <summary> /// 获取某个用户分配了哪些任务 /// </summary> /// <param name="personId">用户Id</param> /// <returns>任务列表</returns> public List<Task> GetTaskByAssignedPersonId(long personId) { var query = GetAll(); if (personId>0) { query = query.Where(t => t.AssignedPersonId == personId); } return query.ToList(); } } }
이 저장소 구현은 템플릿에서 생성된 LearningMpaAbpRepositoryBase 일반 추상 클래스를 상속한 다음 IBackendTaskRepository 인터페이스를 구현합니다. 여기서는 구현 클래스의 매개변수화된 생성자를 명시적으로 선언하고 일반 IDbContextProvider를 사용하여 데이터베이스 컨텍스트 하위 클래스 ChargeStationContext를 상위 클래스의 생성자에 전달해야 합니다.
3. 웨어하우스 주의사항
웨어하우스 방식에서는 ABP가 자동으로 데이터베이스 연결을 열고 닫습니다.
웨어하우징 메소드가 호출되면 자동으로 데이터베이스 연결이 오픈되어 트랜잭션이 시작됩니다.
저장소 메소드가 다른 저장소 메소드를 호출하면 실제로는 동일한 데이터베이스 연결 및 트랜잭션을 공유합니다.
IRRepository 인터페이스는 기본적으로 ITransientDependency 인터페이스에서 상속되므로 저장소 개체는 임시 개체입니다. 따라서 IOC 컨테이너는 주입이 필요한 경우에만 웨어하우징 개체의 새 인스턴스를 자동으로 생성합니다.
기본 일반 저장소는 대부분의 요구 사항을 충족할 수 있습니다. 이것이 만족되지 않는 경우에만 맞춤형 저장소가 생성됩니다.
참고용으로 소스 코드가 Github-LearningMpaAbp에 업로드되었습니다.
ABP 입문 시리즈 카탈로그 - Abp 프레임워크 학습을 위한 실습
위는 ABP 입문 시리즈(4) - 도메인 레이어에서 웨어하우징을 정의하고 구현하는 내용입니다. PHP 중국어 웹사이트(m.sbmmt.com)를 주목하세요!