레파지토리 - Repositories
설명
레파지토리는 도메인 개체 (엔티티(Entity ) 및 값 유형)에 대한 데이터베이스 작업을 수행하는 데 사용됩니다.
기본 레파지토리(Default Repositories)
Axs에서 저장소 클래스는 IRepository <TEntity, TPrimaryKey>
인터페이스를 구현합니다. Axs는 각 엔티티 유형에 대한 기본 레파지토리를 자동으로 생성 할 수 있습니다. IRepository <TEntity>
(또는 IRepository <TEntity, TPrimaryKey>
)를 직접 주입 할 수 있습니다.
Copy public class SampleAppController : ISampleAppController
{
private readonly IRepository < Sample > _sampleRepository;
public SampleAppController ( IRepository < Sample > sampleRepository)
{
_sampleRepository = sampleRepository;
}
public void CreateSample ( CreateSampleDto input)
{
sample = new Sample
{
MyName = input . Name ,
EmailAddress = input . EmailAddress
};
_sampleRepository . Insert (sample);
}
}
기본 레파지토리 메서드
모든 레파지토리에는 IRepository<TEntity>
인터페이스에서 오는 몇 가지 공통 메서드가 있습니다.
Querying
단일 엔터티 가져오기
Copy TEntity Get ( TPrimaryKey id);
TEntity Single ( Expression < Func < TEntity , bool >> predicate);
TEntity FirstOrDefault ( Expression < Func < TEntity , bool >> predicate);
Get 메서드는 지정된 기본 키 (Id)를 사용하여 엔터티를 가져 오는 데 사용됩니다. 주어진 Id를 가진 데이터베이스에 엔티티가 없으면 예외가 발생합니다. Single 메서드는 Get과 비슷하지만 Id가 아닌 식을 사용합니다.
Copy var person = _personRepository . Get ( 14 );
var person = _personRepository . Single (p => p . Name == "Jeff" );
엔티티 목록 가져오기
Copy List < TEntity > GetAllList ( Expression < Func < TEntity , bool >> predicate);
IQueryable < TEntity > GetAll ();
GetAllList 메서드는 데이터베이스에서 모든 엔터티를 검색하는 데 사용됩니다.
Copy var allSamples = _sampleRepository . GetAllList ();
var otherSamples = _sampleRepository . GetAllList (sample => sample . IsActive && sample . Age > 42 );
GetAll 메서드는 IQueryable<T>
를 반환합니다. 이렇게하면 그 뒤에 Linq 메서드를 추가 할 수 있습니다.
Copy //Example 1
var query = from sample in _sampleRepository . GetAll ()
where sample . IsActive
orderby sample . Name
select sample;
var samples = query . ToList ();
//Example 2:
var sampleList2 = _sampleRepository
. GetAll ()
. Where (p => p . Name . Contains ( "H" ))
. OrderBy (p => p . Name )
. Skip ( 40 )
. Take ( 20 )
. ToList ();
GetAll을 사용하면 거의 모든 쿼리를 Linq로 작성할 수 있습니다. 조인 식에서도 사용할 수 있습니다!
GetAllIncluding 을 사용하면 쿼리 결과에 포함될 관련 데이터를 지정할 수 있습니다. 다음 예에서 사람은 Addresses 속성이 채워진 상태로 검색됩니다.
Copy var allSample = await _sampleRepository . GetAllIncluding (p => p . Addresses ). ToListAsync ();
데이터 추가
IRepository 인터페이스는 데이터베이스에 엔티티를 추가하는 메서드를 정의합니다 :
Copy TEntity Insert ( TEntity entity);
TEntity InsertOrUpdate ( TEntity entity);
Insert 메서드는 단순히 새 엔터티를 데이터베이스에 저장하고 같은 엔티티를 반환합니다. InsertOrUpdate 메서드는 Id 값을 확인하여 지정된 엔터티를 저장하거나 수정합니다.
수정
IRepository 인터페이스는 데이터베이스의 기존 엔터티를 수정하는 메서드를 정의합니다. 엔티티를 수정하고 동일한 엔티티 객체를 반환합니다.
Copy TEntity Update ( TEntity entity);
Task < TEntity > UpdateAsync ( TEntity entity);
삭제
IRepository 인터페이스는 데이터베이스에서 기존 엔티티를 삭제하는 방법을 정의합니다.
Copy void Delete ( TEntity entity);
void Delete ( TPrimaryKey id);
void Delete ( Expression < Func < TEntity , bool >> predicate);
확인
아래와 같이 사용자 정의 레파지토리를 사용하기 위해 ISampleRepository와 SampleRepository를 각각 선언해서 사용하면 됩니다.
스웨거에서 확인
SampleAppServer의 GetSamples2메서드에서 확인할 수 있다.
Default 테넌트 사용자로 로그인을 하면 해당 테넌트 데이터만 가져오는 것을 학인할 수 있습니다.
호스트 사용자로 호출 했을 때의 데이터