문제

나는 새로운 애플리케이션에서 데이터 계층을 구현하는 가장 좋은 방법에 대해 동료와 "토론" 중입니다.

한 가지 관점은 데이터 계층이 비즈니스 개체(엔티티를 나타내는 자체 클래스)를 인식하고 해당 개체를 기본적으로 사용할 수 있어야 한다는 것입니다.

반대 관점은 데이터 계층이 객체에 구애받지 않아야 하며 단순한 데이터 유형(문자열, 부울, 날짜 등)만 처리해야 한다는 것입니다.

두 가지 접근 방식 모두 유효할 수 있지만 내 관점에서는 전자를 더 선호한다는 것입니다.이렇게 하면 데이터 저장 매체가 변경되더라도 비즈니스 계층은 (반드시) 새로운 데이터 계층을 수용하기 위해 변경될 필요가 없습니다.따라서 SQL 데이터 저장소에서 직렬화된 xml 파일 시스템 저장소로 변경하는 것은 쉬운 일이 아닙니다.

내 동료의 관점은 데이터 계층이 개체 정의에 대해 알 필요가 없으며 데이터가 적절하게 전달되는 한 그것으로 충분하다는 것입니다.

이것이 종교 전쟁을 일으킬 가능성이 있는 질문 중 하나라는 것을 알고 있습니다. 하지만 그러한 문제에 접근하는 방법에 대한 커뮤니티의 피드백을 주시면 감사하겠습니다.

티아

도움이 되었습니까?

해결책

그것은 정말로 당신의 세계관에 달려 있습니다. 저는 결합되지 않은 캠프에 있었습니다.DAL은 BAL에 데이터를 공급하기 위해서만 존재했습니다. 이야기의 끝입니다.

Linq to SQL 및 Entity Framework와 같은 새로운 기술이 좀 더 대중화되면서 DAL과 BAL 사이의 경계가 약간 모호해졌습니다.특히 L2S에서는 개체 모델이 데이터베이스 필드에 1-1 매핑을 갖기 때문에 DAL은 비즈니스 개체와 매우 밀접하게 연결됩니다.

소프트웨어 개발의 모든 것과 마찬가지로 정답이나 오답은 없습니다.요구 사항과 향후 요구 사항을 이해하고 거기에서 작업해야 합니다.나는 더 이상 트랙 데이에 Range Rover를 사용하는 것처럼 Dakhar 랠리에서 Ferrari를 사용하지 않을 것입니다.

다른 팁

둘 다 가질 수 있습니다.데이터 계층이 귀하의 비즈니스 개체를 알지 못하게 하고 두 가지 이상의 데이터 소스 유형으로 작업할 수 있도록 합니다.데이터와 상호 작용하기 위한 공통 인터페이스(또는 추상 클래스)를 제공하는 경우 각 데이터 소스 유형에 대해 서로 다른 구현을 가질 수 있습니다.여기에는 팩토리 패턴이 잘 어울립니다.

내가 가지고 있는 이 주제를 다루는 훌륭한 책은 다음과 같습니다. 데이터 액세스 패턴, 클리프턴 녹(Clifton Nock).비즈니스 계층을 지속성 계층에서 분리하는 방법에 대한 많은 좋은 설명과 좋은 아이디어가 있습니다.정말 한번 시도해 보세요.제가 가장 좋아하는 책 중 하나입니다.

Jeffrey Palermo는 이에 대해 좋은 글을 썼습니다.그는 그것을 불렀다 양파 아키텍처.

제가 찾은 한 가지 유용한 방법은 데이터 레이어를 "컬렉션에 구애받지 않게" 만드는 것입니다.즉, 데이터 레이어에서 개체 목록을 반환하려고 할 때마다 호출자가 목록을 전달하도록 합니다.따라서 이 대신:

public IList<Foo> GetFoosById(int id) { ... }

나는 이것을한다:

public void GetFoosById(IList<Foo> foos, int id) { ... }

이렇게 하면 필요한 전부인 경우 기존 List를 전달할 수 있고, UI에서 바인딩하려는 경우 IList<T>(예: ObservableCollection<T>)의 보다 지능적인 구현을 전달할 수 있습니다.또한 이 기술을 사용하면 오류 메시지가 발생한 경우 오류 메시지가 포함된 ValidationResult와 같은 메서드에서 항목을 반환할 수 있습니다.

이는 여전히 내 데이터 계층이 내 개체 정의에 대해 알고 있음을 의미하지만 유연성을 한 단계 더 제공합니다.

Linq to SQL을 확인해 보세요. 지금 새 애플리케이션을 만들고 있다면 완전히 Linq 기반 데이터 계층에 의존하는 것을 고려할 것입니다.

그 외에는 데이터와 로직을 최대한 분리하는 것이 좋은 습관이라고 생각하지만 항상 실용적인 것은 아닙니다.논리와 데이터 액세스 간의 순수한 분리로 인해 조인 및 최적화가 어려워지고 이것이 Linq를 매우 강력하게 만드는 이유입니다.

NHibernate를 사용하는 애플리케이션에서 대답은 "그 사이 어딘가"가 됩니다. 즉, XML 매핑 정의(어떤 테이블이 어떤 개체에 속하고 어떤 열이 어떤 필드에 속하는지 등을 지정)는 명확하게 비즈니스 개체 계층에 있습니다. .

이는 비즈니스 개체를 전혀 인식하지 못하는 일반 데이터 세션 관리자에게 전달됩니다.유일한 요구 사항은 CRUD를 위해 전달된 비즈니스 개체에 매핑 파일이 있어야 한다는 것입니다.

오래된 게시물이지만 비슷한 정보를 검색하다가 발견했습니다. 이것 그것은 그것을 잘 설명합니다.

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