2013-04-02 3 views
7

ASP.NET에서 3 계층 아키텍처로 웹 응용 프로그램을 만들고 싶습니다. 그러나 순환 참조에 문제가 있습니다.3 계층 아키텍처의 순환 참조 문제 C#

  1. 애플리케이션 레이어 함유 UI :

    I는 3 층을 갖는다.

  2. 모든 로직 및 도메인 클래스를 포함하는 비즈니스 계층.
  3. 모든 데이터베이스 상호 작용 방법이 포함 된 데이터 계층입니다.

나는 데이터베이스 작업을 수행하는 비즈니스 계층에서 데이터 계층 방법을 사용하고 이러한 방법에서 나는 데이터 계층에 도메인 클래스 객체를 전달해야하지만이 때문에 순환 참조를 할 수 없습니다.

예를 들어, 일부 속성 및 메서드가 포함 된 Person 도메인 클래스가 있습니다. 이제 데이터베이스에 Person을 삽입하고 싶습니다. Person 클래스에 InsertPerson()이라는 메서드가 있습니다. 이 메서드 본문에서는 데이터베이스에 삽입 할 데이터 영역의 함수를 호출해야합니다. 그러나 데이터 레이어 참조가 비즈니스 레이어에 추가되고 전체가 사람 개체를 데이터 레이어 메서드로 전달할 수 없으며 그 반대로도 불가능합니다.

이 문제를 어떻게 피할 수 있습니까? 제발 제안 해주세요.

+0

은 1입니다. 모든 비즈니스 ob의 기본 클래스가 있습니다. 비즈니스 및 데이터 계층 모두에 대해 알고 있어야합니다. 그것은 그것의 테이블을 알고 행과 연결되어 있습니다. 2. 저장하려면 데이터 계층이 행을 가져 와서 스키마를 검사하고 쿼리를 저장하여 저장 한 다음 해당 테이블에 저장하면됩니다. 3.로드하기 위해 데이터 계층은 businessObject가 하위 클래스로 만드는 유형을 전달하고 테이블에서 가져 오는 행에서 형식의 생성자를 반사 적으로 사용합니다. – Patashu

+0

필자의 의도를 명확하게 설명하기 위해 필자의 대답에 편집을 추가했습니다. –

답변

8

도메인 개체를 비즈니스 로직에서 분할하여 조작 할 수 있습니까? 그래서 이며 상대적으로 기본 연산을 포함하는 데이터를 가지고 있습니다. 그런 다음 비즈니스 계층은 더 많은 동작이됩니다 on 데이터 - 종종 한 번의 작업에서 여러 개의 다른 클래스를 사용합니다.

그런 다음 네 개의 어셈블리를 가진 끝 :

UI   /
    Business logic | Domain classes 
    Data layer  \ 

그래서 세 개의 층이 효율적으로, 일반적인 용어로 도메인 클래스를 사용합니다.

저는이 작업을 꽤 잘 보았습니다. 도메인 클래스는 일반적으로 다른 클래스와 독립적 인 측면에 대해 일부 유효성 검사 관련 논리를 여전히 포함 할 수 있지만 일반적으로 약간 "멍청한"의미를 갖습니다.도메인 (비즈니스 로직) DAL (지속성을위한 인프라)에 대한 참조가 없어야합니다 그냥 인터페이스를 선언 : 물론

, 대체 방법 :

+0

이 솔루션의 SavePerson 메서드는 데이터 액세스 계층에서 어떻게 생겼습니까? –

+0

@Peri : 더 많은 정보 없이는 대답하기가 어렵습니다. 그러나 비즈니스 계층을 포함하지 않는 데이터 계층을 기대합니다. 엔티티가 저장된 위치와 방법을 알고 있어야합니다. 정확히 그 의미는 다른 많은 맥락에 달려 있습니다. (나는 불행히도이 문제에 대해 너무 오랫동안 주석을 달기 위해 꽤 독점적 인 솔루션을 개발 해왔다.) –

+0

나는 분명해야한다. DataAccess.SavePerson이 매개 변수 또는 성, 성으로 Person을 수신하는지 묻고 싶습니다. 어셈블리 간의 참조가 어떻게 구성되는지 이해할 수 없습니다. –

-1

응용 프로그램에서 3 계층 아키텍처를 사용하는 경우 개체를 데이터 액세스 계층에 전달할 수 없습니다. ojects는 비즈니스 계층에서만 사용할 수 있습니다. 최상의 아키텍처는 데이터 액세스 레이어에서 객체를 사용하려는 경우 도메인 모듈입니다.

1

당신은 더 나은 고전 DDD 사용하는 것 많이 있습니다 그 인프라는 (그 약 분산 응용 프로그램 경우 서비스 또는 분산) 전용 응용 프로그램 계층을 사용하면 도메인과 프리젠 테이션 레이어를 사용하는 응용 프로그램 서비스를 쓰기 응용 프로그램 계층보다 (저장소)를 구현한다 :

enter image description here

(D) DDD의 좋은 예 : http://microsoftnlayerapp.codeplex.com/

+1

당신은 Ayende Rahien이 당신에게 링크를 준 코드에 관해 말해야한다는 것을 읽어야한다고 생각합니다. –

+0

이 솔루션에는 DDD가 없습니다. –

3

비즈니스 논리 DLL에 데이터 액세스 계층에 대한 참조가 없어야합니다. 데이터 액세스 계층은 비즈니스 로직 DLL을 참조해야합니다. 비즈니스 로직 코드는 데이터베이스 (또는 비즈니스 로직의 외부 요소)에 액세스하기 위해 대화하려고하는 인터페이스를 정의해야하며 다른 DLL은 비즈니스 로직 계층에 대한 서비스를 제공하도록 구현해야합니다.

이것은 종속성 반전 원리입니다. 높은 수준의 모듈은 낮은 수준의 모듈에 의존해서는 안됩니다. 여기서 비즈니스 로직은 상위 모듈입니다. 데이터 액세스 dll은 비즈니스 로직 dll 관점에서 구현 세부 사항입니다.

 
public interface IPersonRepository 
{ 
    void SavePerson(Person p); 
} 
public class PersonServices 
{ 
    PersonServices(IPersonRepository repo) 
    { 
     // 
    } 
    public void FirePerson(Person toFire) 
    { 
     toFire.FireHim(); 
     repo.SavePerson(toFire); 
    } 
} 

DAL :

예를

BLL을 표시하려면

 
public class PersonRepository : IPersonRepository 
{ 
    // ... 
} 
UI :
 
var repo = new PersonRepository(); 
var ps = new PersonService(repo); // wire by hand or use container

ps.FirePerson(somePerson);

참고 : 나는 다 봤어요 어떻게

 
UI -> BLL 
    -> DAL 

DAL -> BLL 

BLL -> nothing!