2011-02-10 3 views
1

데이터 액세스 계층을 만들기 위해 Entity Framework 4.0을 사용했습니다. 그런 다음 비즈니스 로직 레이어에 DAL과 동일한 개체가 있지만 일부 확장 (예 : 더 많은 속성, 일부 기능 및 설정자의 데이터 유효성 검사)이 있음을 발견했습니다.엔티티 클래스에서 상속 및 클래스 확장

DAL과 BLL을 별도의 프로젝트로 계획했으며 BLL에서 엔터티 클래스를 사용하고 코드에서 중복을 방지하는 것이 가장 좋습니다.

난 검색 같이 두 가지 아이디어가있다 : 동일한 프로젝트 내

  1. 연장 엔티티 클래스 (엔티티 클래스 관련 BLL 클래스 구현) 인터페이스를 사용하여 부분 클래스
  2. 의해. 이전에는 프로그래머들 사이에서 인기가있었습니다. 위의 해결을위한

단점 :

  1. 우리는 부분 클래스의 일환으로 같은 프로젝트에 코드를 추가해야합니다. 이것은 속성과 메서드를 추가하는 데 유용하지만 무언가를 오버라이드하는 것은 좋지 않습니다 (비즈니스 로직 레이어에서 속성을 설정하기 전에 유효성 검사 추가).
  2. 엔터티 모델이 변경되면 엔터티 클래스에서 수동으로 인터페이스를 다시 추출해야합니다 또한 BLL 관련 클래스의 또 다른 변경이 필요합니다 (두 가지 수동 작업이 필요합니다).

제 질문은 관련 엔터티 클래스의 BLL 클래스를 상속받지 않고 해당 메서드와 속성을 확장/재정의하는 것입니다.

답변

3

여러분이 명심해야 할 사실 중 하나는 Entity Framework와 같은 ORM이 실제로 (일반적인 3-tier 아키텍처를 통해 볼 때) 간단한 데이터 액세스 계층을 생성하지 않는다는 것입니다. 그들이 당신에게주는 것은 데이터 액세스 상호 작용에 대해 좀 더 세부적인 수준의 제어를 제공하는 비즈니스 계층입니다. 나는 EF가 본질적으로 DAL이되고 컨텍스트와 엔티티 유형이 BLL이 될 수 있다고 주장 할 수 있습니다.

MVC 또는 MVVM 아키텍처, 모델 (EF 레이어), 컨트롤러 또는 뷰 모델 (비즈니스 로직이있는 곳, 모델을 캡슐화하는 곳)이있는 곳에서 훨씬 쉽게 볼 수 있습니다. 및 전망.

어쨌든 EF는 실제로 엔티티 유형을 직접 인스턴스화해야하므로 EF는 사용자의 하위 유형을 반환 된 엔티티로 사용하지 않으므로 상속하지 않으면 많은 도움이되지 않습니다. EF에서 유효성 검사 및 유사한 작업을위한 솔루션은 부분적으로 클래스 (분명히 알 수있는)과 부분 을 사용하는 것입니다. EF의 기본 코드 생성 템플릿은 OnPROPERTYNAMEChangingOnPROPERTYNAMEChanged의 모든 스칼라 속성에 대한 부분 메서드를 생성합니다.

당신이 당신의 User 엔터티 형식상의 int UserId 재산이있는 경우 예를 들어, 다음과 같습니다 부분 클래스를 만들 수 있습니다

public partial class User 
{ 
    partial void OnUserIdChanging(int newUserId) 
    { 
     // do something 
    } 

    partial void OnUserIdChanged() 
    { 
     // do something 
    } 
} 

당신은 물론, 하나를 사용하거나 경우 다른 너는 좋아한다.partial 메소드가 상속 호출 (상상할 수 있다고 가정)에 비해 장점은 부분 메소드가 가상이 아니기 때문에 (올바른 멤버를 호출하기위한 가상 테이블 조회가 없음) 만 클래스의 일부로 컴파일 됨 실제 구현이있는 경우 당신은 디자이너 코드에 가서 실제로 함수에 메소드 본문을 추가하지 않으면

partial void OnUserIdChanging(int value); 
partial void OnUserIdChanged(); 

의 선언을 볼 수 있지만 즉

, 다음 C# 컴파일러가 완전히 제거 함수 및 코드에서이 코드로의 모든 호출을 처리합니다. 이렇게하면 빈 함수를 호출 할 필요가 없기 때문에 유형을 더 작게 만들고 다른 속성을 더 빨리 호출 할 수 있습니다.

+0

컨트롤러가 모드를 캡슐화하는 'MVC'에서 언급했듯이, 별도의 프로젝트에서 더 높은 추상화 수준으로 엔티티 클래스를 캡슐화하려고합니다. 상속 된 클래스는 기본 엔티티 클래스의 한 유형이므로 엔티티 프레임 워크에 새로운 클래스를 전달할 수 있습니다. EF 생성 코드 (엔티티 클래스)를 변경하지 않을 것입니다. 내 자신의 'BLL'이 필요하며 EF 생성 코드를 변경하지 않고 유지하려고합니다. EF에서 하위 유형을 반환하지 않기를 바랍니다. – Xaqron

+0

@Xaqron : 요점은 MVC 및 유사한 아키텍처가 * 상속 *이 아닌 * 캡슐화 *를 통해 작동한다는 것입니다. 이와 같은 접근 방식을 채택하고 싶다면 엔티티 유형 자체를 상속하는 것이 일반적으로 그렇게되지는 않습니다. –