내 검색어를 입력 할 위치 - 모델 대 컨트롤러

architecture asp.net-mvc-3 dapper

문제

방금 ActiveRecord / NHibernate에서 Dapper로 전환했습니다 . 이전에는 컨트롤러에서 모든 쿼리를 수행했습니다. 그러나 내 모델 (예 : 요약 / 합계 / 평균)에서 구현하기에 편리한 일부 속성은 모델에서 인스턴스 변수 (컬렉션)를 반복하여 계산할 수 있습니다.

구체적으로 말하자면, 나의 ProjectAppSessions 이라는 개념을 가지고 있으며 AppSessions 을 반복하면서 총 세션 수와 평균 세션 길이를 someProject.AppSessions 있습니다.

이제는 Dapper에있어 혼란스러워 보입니다. 내 컨트롤러 메소드가 Dapper (괜찮아 보이는 것)를 통해 데이터베이스에 쿼리를 수행하지만 내 모델 클래스는 Dapper (이상하게 보임)를 통해 데이터베이스에 쿼리를 수행합니다.

TLDR : DB 액세스가 내 모델이나 컨트롤러 또는 둘 다에 있어야합니까? 둘 다 올바르지 않은 것 같아요. DB 액세스 스타일을 변경하면 너무 많은 영향을 미치지 않도록 하나의 "레이어"로 제한하고 싶습니다.

수락 된 답변

저장소 패턴 사용을 고려해야 합니다 .

리포지토리를 사용하면 모든 데이터베이스 쿼리가 공용 인터페이스를 통해 노출 된 리포지토리에 캡슐화됩니다 (예 :

public interface IGenericRepository<T> where T : class
{
    T Get(object id);
    IQueryable<T> GetAll();
    void Insert(T entity);
    void Delete(T entity);
    void Save(T entity);
}

그런 다음 컨트롤러에 저장소를 삽입 할 수 있습니다.

public class MyController
{
    private readonly IGenericRepository<Foo> _fooRepository;
    public MyController(IGenericRepository<Foo> fooRepository)
    {
        _fooRepository = fooRepository;
    }   
}

이것은 UI에 DB 의존성이 없도록하고 테스트를 더 쉽게 만듭니다. 유닛 테스트에서 IRepository를 구현 한 모든 모의 (mock)를 주입 할 수 있습니다. 또한 리포지토리는 Dapper 또는 Entity Framework와 같은 기술을 구현하고 클라이언트를 변경하지 않고 언제든지 전환 할 수 있습니다.

위의 예에서는 일반적인 저장소를 사용했지만 사용자는 그렇게 할 필요가 없습니다. IFooRepository와 같은 각 저장소에 대해 별도의 인터페이스를 생성 할 수 있습니다.

저장소 패턴을 구현하는 방법에 대한 많은 예와 많은 변형이 있으므로 Google에서이를 이해하는 데 더 많은 시간을 할애 할 수 있습니다. 여기 내가 제일 좋아하는 기사 중 하나입니다. 계층화 된 아키텍처 .

또 다른 메모 : 소규모 프로젝트의 경우 컨트롤러에 쿼리를 직접 입력하는 것이 좋습니다.


인기 답변

저장소 모델에 관한 @ void-ray에 동의합니다. 그러나 인터페이스 및 종속성 삽입을 원하지 않으면 데이터 액세스 계층을 분리하고 정적 메서드를 사용하여 Dapper에서 데이터를 반환 할 수 있습니다.

Dapper를 사용할 때 일반적으로 매우 작은 객체 또는 목록을 반환하는 저장소 라이브러리가 ViewModel에 매핑되어 View에 전달 될 수 있습니다 (매핑은 StructureMap에서 수행되지만 컨트롤러 나 다른 도우미에서 처리 할 수 ​​있음) .



아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.