2014-03-27 1 views
1
난 그냥 내 asp.net 웹 API 프로젝트에 Ninject에 의존성 삽입 (Dependency Injection)를 사용하여 작품의 저장소 패턴 & 장치를 구현하기 위해 마무리

.ASP.NET 웹 API 저장소 패턴 서비스 계층 (비즈니스 로직)

내 ORM으로 Entity Framework를 사용하고 있습니다.

나는 다음과 같은 soluction 구조 (프로젝트)이 있습니다

  • 웹 응용 프로그램 (asp.net 웹 API)
  • 데이터 (DBContext, 저장소)를
  • 인터페이스 (IRepository 등)
  • 을 모델 (DB의 POCO 클래스)

예를 들어 내 PersonRepository (데이터 프로젝트) :

public class PersonsRepository : EFRepository<Person>, IPersonsRepository 
      { 
       public PersonsRepository(DbContext context) : base(context) { } 

       public IQueryable<Person> GetByAge(int age) 
       { 
        return DbSet.FirstOrDefault(ps => ps.age == age); 

       } 

    public void Delete(int personId, int age) 
      { 
       // Here I want to validate some stuff before deleting 
       // Business Rules need to be here!! 

       var attendance = new Attendance {PersonId = personId, Age = age}; 
       Delete(attendance); 
      } 

      } 

제 질문은 저의 리파지토리 메소드 안에 모든 비즈니스 로직을 구현하는 것이 맞습니까? 또한 필요한 경우 메시지 또는 유효성 확인을 반환하는 가장 좋은 방법은 무엇입니까?

도움에 감사드립니다.

답변

1

아니요, 아닙니다. 저장소 구현은 지속성 (DAL)에 속합니다. 리포지토리는 비즈니스 개체를 데이터베이스에 저장하는 데 사용되는 양식으로 변환하거나 변환하는 것과 관련이 있습니다. 비즈니스 논리에 신경 쓰는 것은 책임이 아닙니다. 비즈니스 로직은 도메인의 비즈니스 계층에 있습니다.

비즈니스 논리는 도메인 개체 및 서비스에 포함되어 있습니다. DAL (저장소, EF 등)이 아닌 UI (컨트롤러)가 아닌 비즈니스 계층 외부로는 절대 도달하지 않습니다.

리포지토리의 목적에 어긋나지 않으므로 사용중인 리포지토리 구현이 올바르지 않습니다. 비즈니스 계층을 지속성 세부 정보 (EF는 구현 세부 정보)와 분리합니다. 저장소의 인터페이스는 IQueryable 또는 EF 엔티티와 같은 세부 정보를 노출하지 않아야합니다. 그것은 비즈니스 객체에 대해서만 '알아야'합니다.

귀하의 솔루션 구조 나에게 거의 의미 : 당신이 사용하고있는 모든 인터페이스들은에 속하는 계층에 있어야합니다 (저장소 인터페이스는 비즈니스 계층의 일부가 그것을 EF에 대해 알고 안되는 이유, 그건). 설명에 기반한 모델은 지속성 모델 (데이터의 일부 여야 함) 인 것처럼 보입니다.

당신은 모델이 정말 비즈니스 모델을 의미 비즈니스 (도메인) 레이어를 원한다. 지속성 모델 (EF에서 사용), 뷰 모델 (뷰에서 사용) 또는 MVC에서 M (컨트롤러에서 사용) :)과 혼동하지 마십시오. MVC의 M은 비즈니스 모델의 일부를 말하지만 비즈니스 모델과 다른 것은 아닙니다. 내가 제안

당신의 시간을 가지고 저장소 패턴과 3 계층 아키텍처에 대해 좀 더 읽고, 개념과 목적을 이해했는지 확인합니다.

+0

사실 나는 John Papa Code Camper 프로젝트 (https : // github.com/johnpapa/CodeCamper 예제 코드에서 저장소 패턴은 사용자 지정 리포지토리에 대한 사용자 지정 구현입니다 ... GetByAge 메서드는 PersonRepo에만 사용됩니다 – VAAA

+0

그래서 내게 말한 것은 비즈니스 규칙 또는 논리 (조건이 참이거나 모델 프로젝트 (POCO 클래스가있는 곳)에 어떤 필드가 올바른지 확인하려면 – VAAA

+1

비즈니스 로직은 데이터 액세스가 아닌 비즈니스 로직 계층에 있어야합니다. – MikeSW

2

데이터라는 데이터와 웹 사이에는 비즈니스라는 새 계층이 있어야합니다. 웹은 비즈니스 계층 만 참조하고 비즈니스 계층은 데이터 계층 만 참조합니다. 따라서 Data 레이어를 호출하기 전이나 후에 비즈니스 레이어는 모든 유효성 검사 및 비즈니스 로직을 구현할 수 있습니다.

관련 문제