건축 적으로 말하면 Microsoft의 Entity Framework와 같은 데이터베이스 추상화 계층에서 별도의 데이터 액세스 계층이 필요하지 않습니까?


11

그것이 있었던 방식

몇 년 동안 저는 다음과 같은 소프트웨어 솔루션을 조직했습니다.

  • 데이터 액세스 비즈니스를 추상화하기위한 DAL (Data Access Layer)
  • 비즈니스 규칙을 데이터 세트에 적용하고 인증을 처리하는 BLL (Business Logic Layer)
  • 유틸리티 (Util)는 시간이 지남에 따라 구축 한 일반적인 유틸리티 메소드의 라이브러리 일뿐입니다.
  • 물론 웹, 데스크탑, 모바일 등 모든 것이 가능합니다.

지금의 방식

지난 4 년 동안 나는 Microsoft의 Entity Framework (주로 .NET 개발자)를 사용 해 왔으며 Entity Framework가 이미 내 DAL이했던 일 : 데이터베이스에 대해 CRUD를 실행하는 사업을 추상화합니다.

따라서 일반적으로 다음과 같은 메소드 모음이있는 DAL로 끝납니다.

public static IQueryable<SomeObject> GetObjects(){
    var db = new myDatabaseContext();
    return db.SomeObjectTable;
}

그런 다음 BLL에서이 방법은 다음과 같이 사용됩니다.

public static List<SomeObject> GetMyObjects(int myId){
    return DAL.GetObjects.Where(ob => op.accountId == myId).ToList();
}

이것은 물론 BLL이 일반적으로 몇 줄의 로직을 더 적용하기 때문에 간단한 예이지만, 그러한 제한된 범위에 대해 DAL을 유지하는 것은 약간 과도하게 보입니다.

DAL을 포기하고 BLL 방법을 다음과 같이 작성하는 것이 낫지 않습니까?

public static List<SomeObject> GetMyObjects(int myId){
    var db = new myDatabaseContext();
    return db.SomeObjectTable.Where(ob => op.accountId == myId).ToList();
}

위에서 언급 한 이유로 향후 프로젝트에서 DAL을 삭제하는 것을 고려하고 있지만 그렇게하기 전에 프로젝트를 진행하기 전에 여기에서 커뮤니티를 여론 / 예언 / 의견을 위해 여론 조사를하고 싶습니다. 기대하지 마십시오.

모든 의견을 부탁드립니다.

최신 정보

합의는 별도의 DAL이 필요하지 않은 것으로 보이지만 (여기서 내 자신의 추론을 만드는 것)은 공급 업체의 잠금을 피하는 것이 좋습니다. 예를 들어, 위 그림과 같이 EF 통화를 추상화하는 DAL이있는 경우 BLL을 다시 작성할 필요가없는 다른 공급 업체로 전환하십시오. DAL의 기본 쿼리 만 다시 작성하면됩니다. 그렇게 말하면서, 나는 이것이 일어날 시나리오를 구상하기가 어렵다는 것을 알게되었습니다. 이미 Oracle db의 EF 모델을 만들 수 있습니다 .MSSQL이 제공됩니다 .MySql도 가능하다는 것을 확신합니다 (??). 그래서 여분의 코드가 가치있는 ROI를 부여하는지 확실하지 않습니다.


3
데이터 액세스 계층은 EF와 어떻게 다릅니 까? EF가 데이터 액세스 계층이 아닙니까? 비즈니스 로직과 EF 사이에 추상화를 유지하는 이유는 테스트를 위해 스터 빙을보다 쉽게하고 공급 업체의 잠금을 피하기 위해서입니다.
Marjan Venema

2
그것은 내 요점입니다. 내 견해에는 차이가 없지만, 나는 반점을 찾고 있습니다. 감사.
매트 Cashatt

3
개인적으로 EF / NHibernate는 자체적으로 데이터 액세스 계층이기 때문에 별도의 DAL을 만들 이유가 없습니다. 마르 얀이 언급 한 바와 같이, EF 당신은 그것을 고려할 수 있다면 당신은 데이터베이스 공급 업체 변화를 볼 수는 (IMO) 불필요한 코드가 될 수 있도록 NHibernate에 당신이, 한 줄의 코드 (메모리 테스트도 SQLite는 드라이버)에서 드라이버를 교체 할 수 있습니다.
Patryk Ćwiek

3
두 개의 DAL이 필요하지 않습니다. 다른 사람들이 언급했듯이 BLL을 유지하되 BLL을 공급 업체별 구성에 고정하지 않도록주의하십시오. 나는 항상 물건이 문자열이나 정수 수준으로 내려가는 것을보고 싶습니다. 그런 다음 웹 서비스, 직렬 포트, 전신 링크, 농담과 같은 매우 원시적 인 채널을 통해 전체 BLL / DAL 접합을 쉽게 노출 할 수 있음을 알고 있습니다.
Andyz Smith

1
다시 업데이트 : 조롱 / 스텁 /의 날조가 있기 때문에 훨씬 쉽게 busineslayer의 Unittests 할 수있는이 추가 레이어 GetMyObjects(int myId)의 날조 / 스텁 / 조롱하는 것보다 쉽습니다을 GetObjects.Where(ob => op.accountId == myId).ToList().
k3b

답변:


6

이것이 당신이 찾고있는 대답인지 확실하지 않지만 여기에갑니다.

우리는 사물을 분리 / 조직화하기 위해 노력합니다. 예, EF / NHibernate는 데이터 액세스입니다. 그러나 일반 리포지토리 설정을 사용하여 자체 어셈블리로 사용을 제한합니다. 이 어셈블리에는 모든 NHibernate 매핑, 세션 팩토리, 여러 데이터베이스를 처리하기위한 코드 등이 포함되어 있습니다.

전체 어셈블리가 ORM을 지원하기 위해 존재하기 때문에 여전히 "데이터 액세스 계층"이라고합니다.

아마도 우리의 주요 응용 프로그램은 5 개의 데이터베이스를 참조하고 약 4,500 개의 도메인 객체 / 매핑 및 다양한 스키마를 가지고 있습니다. 따라서이 설정은 우리에게 의미가 있습니다. 아마도 더 작은 응용 프로그램의 경우이 어셈블리를 건너 뛸 것이지만 .. 조직화 된 코드에 대한 빨판이며 어쨌든 그것을 할 것입니다 :)


2

EF와 DAL은 엔터프라이즈 시스템에서 별도의 구성 요소로 봅니다. 데이터 액세스 계층은 다른 서비스가 데이터 지속성 및 관리를 수행하는 데 사용하는 추상화입니다. 일반적으로 Entity Framework는 쿼리, 업데이트, 삭제 및 삽입과 관련하여 훌륭한 API를 구축하지만 핵심에는 여전히 백엔드 데이터 소스에 직접 연결해야합니다. 따라서 모든 유형의 라우팅 또는 방화벽은 EF 작동을 중지하므로 EF 중개 구성 요소를 작성해야합니다.

다음은 DAL과 EF가 어디에 적합한지를 보여주는 고급 예입니다.

-------------    -------                                    ----------------    ------
| Service A | -> | DAL | -> { LOCAL / LAN / WAN ACCESS } -> | DAL BACK-END | -> | EF |
-------------    -------                                    ----------------    ------

더 나은 디자인은 비즈니스 로직이나 서비스 구현이 EF 계층에 직접 액세스하는 것을 허용하지 않는 것이 저의 경험이었습니다. 대신, 모든 영구 데이터 작업에 대한 추상화를 제공하여 유선으로 요청을 전달하거나 로컬로 수행 할 수 있습니다.

이 디자인은 누출이있는 추상화를 소개합니다. 따라서 사례별로 고려해야합니다.

몇 가지 질문이 있습니다 :

  • 데이터에 액세스하는 모든 구성 요소가 백엔드 데이터 저장소에 대한 연결을 얻을 수 있습니까?
  • EF를 사용하면 여러 유형의 데이터 저장소에서 데이터 세트를 집계 할 수 있습니까? 예를 들어 문서 용으로 MongoDB와 함께 SQL 데이터베이스를 사용합니다.

1

요즘에는 데이터 스토리지 변경 여부에 대한 질문이 예전보다 흥미 롭습니다. 왜냐하면 MS SQL과 Oracle SQL간에 교환 할 것인지 아닌지에 대한 질문이 아니기 때문입니다. 다양한 NoSQL 데이터 스토리지 제품을 데이터 저장소로 사용할 수 있습니다.

이러한 종류의 변경이 심각 할 경우 EF 코드를 DAL 내에서 격리하여 나중에 리포지토리 요청을 NoSQL 데이터베이스에 매핑하는 새로운 DAL을 도입 할 수 있도록하는 것이 좋습니다. 물론 그러한 변화는 DB 관련 가정으로 인해 BLL을 도매로 다시 작성하는 것으로 끝날 수 있습니다.

마찬가지로, DAL 내의 EF는 아마도 BLL 코드 단위 테스트를위한 데이터 액세스를 더 간단하게 조롱 할 것입니다.

따라서 필자는 EF (또는 다른 ORMS)가 데이터 액세스 계층의 필요성을 반드시 무효화 할 필요는 없다고 생각합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.