문제

제가 진행하고 있는 프로젝트는 n-tier 아키텍처를 사용하고 있습니다.우리의 레이어는 다음과 같습니다:

  • 데이터 접근
  • 비즈니스 로직
  • 사업체
  • 프레젠테이션

비즈니스 로직은 데이터 액세스 레이어를 호출하고 프레젠테이션 레이어는 비즈니스 로직 레이어를 호출하며 비즈니스 엔터티는 모두 참조됩니다.

우리 사업체는 기본적으로 데이터 모델과 1-1과 일치합니다.테이블마다 수업이 있어요.처음에 프레임워크를 설계했을 때 마스터-세부 사항 또는 하위-상위 관계 관리에 대한 고려 사항은 없었습니다.따라서 모든 비즈니스 논리, 데이터 액세스 및 비즈니스 엔터티는 데이터베이스의 단일 테이블만 참조했습니다.애플리케이션 개발을 시작하자마자 개체 모델에 이러한 관계가 없으면 심각한 피해를 입는다는 사실이 금방 분명해졌습니다.

모든 레이어(데이터베이스 포함)는 모두 자체 개발 코드 생성기를 구동하는 데 사용하는 내부 메타데이터 데이터베이스에서 생성됩니다.

문제는 엔터티의 관계를 로드하거나 지연 로드하는 가장 좋은 방법이 무엇인지입니다.예를 들어 주소 테이블과 마스터-하위 관계를 갖는 개인 클래스가 있다고 가정해 보겠습니다.이는 비즈니스 엔터티에서 Person 개체에 대한 Addresses의 컬렉션 속성으로 표시됩니다.일대일 관계가 있는 경우 이는 단일 엔터티 속성으로 표시됩니다.관계 개체를 채우고 저장하는 가장 좋은 방법은 무엇입니까?우리의 비즈니스 엔터티는 비즈니스 로직 계층에 대한 지식이 없으므로 속성 get이 호출될 때 내부적으로 수행할 수 없습니다.

나는 이 작업을 수행하기 위한 일종의 표준 패턴이 있다고 확신합니다.어떤 제안이 있으십니까?

또한 한 가지 주의할 점은 DataAcess 계층이 리플렉션을 사용하여 엔터티를 구축한다는 것입니다.저장 프로시저는 하나의 테이블을 기반으로 하나의 결과를 반환하고 리플렉션을 사용하여 속성 이름과 열 이름을 일치시켜 비즈니스 개체를 채웁니다.따라서 조인을 수행하는 것은 어려울 것입니다.

도움이 되었습니까?

해결책

Fowler's를 보시는 것을 적극 추천합니다. 엔터프라이즈 아키텍처의 패턴 책.이러한 종류의 문제를 해결하기 위한 몇 가지 접근 방식이 있으며, 엔터티 관계를 포함하여 그가 간략하게 설명합니다.

가장 매력적인 항목 중 하나는 기본적으로 수집기인 작업 단위 패턴입니다. 이 패턴은 엔터티에 대해 수행된 작업을 관찰하고 작업이 완료되면 적절한 데이터베이스 호출을 일괄 처리하고 요청을 수행합니다. 데이터 베이스.이 패턴은 다음에서 사용하는 핵심 개념 중 하나입니다. NH절전 모드, "작업"의 끝을 알리기 위해 IDisposable을 구현하는 개체를 사용합니다.이를 통해 작업을 using으로 래핑하고 작업 단위가 작업을 처리하도록 할 수 있습니다.

편집하다:추가 정보

이것 작업 단위의 기본 클래스 구조에 대한 링크입니다. 실제로는 세상에서 가장 흥미로운 것은 아닙니다.Fowler는 그의 책에서 더 자세한 내용을 제공하며 그 중 일부는 볼 수 있습니다. 여기.가능한 구현으로 NHibernate의 Session 개체를 볼 수도 있습니다(나는 ISession 인터페이스...구현이 어디에 있는지 확실하지 않음)

도움이 되었기를 바랍니다.

다른 팁

내가 과거에 사용한 접근법은 컨테이너 유형을 필요한 객체를 가져올 수있을 정도로 똑똑하게 만드는 것입니다. 예 :

public class Relation<T>
{
  private T _value;

  private void FetchData()
  {
    if( LoadData != null ) {
      LoadDataEventArgs args = new LoadDataEventArgs(typeof(T), /* magic to get correct object */);
      LoadData(this, args);
      _value = (T)args.Value;
    }
  }

  public event EventHandler<LoadDataEventArgs> LoadData;

  public T Value {
    get {
      if( _value == default(T) )
        FetchData();
      return _value; 
    }
    set { /* Do magic here. */ }
  }
}

그런 다음 다음과 같이 엔터티에서 선언합니다.

[RelationCriteria("ID", EqualsMyProperty="AddressID")]
public Relation<Address> Address {
  get; set;
}

또한 주소 속성을 선언하여로드 데이터 이벤트에 처리기를 추가하기 위해 주소 속성을 선언하는 유형의 로더에 달려 있습니다.

비슷한 수업은 Ilist를 구현하여 당신에게 일대일 관계를 제공합니다.

어떤 언어를 사용하고 있습니까? 당신이 설명한 것은 엔티티 프레임 워크가 .NET에서하는 일입니다. 그러나 당신은 당신이 사용하고있는 언어를 공유하지 않았으며, 나는 당신이 당신의 datalayer를 다시 작성하고 싶지 않다고 가정합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top