이 나쁜 디자인입니까? 어떻게 개선 할 수 있습니까?


9

나는 다음을 잠시 썼지 만 최근에 그것을 검토하기 위해 왔으며 이제는 그것이 좋은 디자인이라고 생각하지 않습니다.

디자인은 Entity Framework 4를 사용하는 일종의 모듈 식 데이터베이스 계층을위한 것입니다. 지정된 위치의 외부 라이브러리에서 엔티티 프레임 워크 컨텍스트를 느리게로드하는 단일 데이터베이스 개체가 있으며로드 된 컨텍스트의 인스턴스는에 대한 해시 테이블에 저장됩니다. 그들의 이름 (EG "ContentMgmtContext").

이 시스템에서 데이터베이스와의 모든 접촉은 저장 프로 시저를 통해 이루어집니다. 데이터베이스를 호출하기 위해 쿼리 메소드 서명은 다음과 같습니다.

List<TReturn> Query<TReturn>(string Context, 
                             string Procedure, 
                             TransactionScope Scope, 
                             List<ObjectParameter> QueryParameters)

이 모듈성은 내가 좋아하는 것입니다. 그러나이 방법에는 한 가지 중요한 단점이 있습니다. when using the database layer, the code using it has to have a reference to the library in which the context is stored, in order to access the types returned by the stored procedures through Entity Framework.모델에서 데이터베이스 계층의 개체는보기 및 컨트롤러가 사용하는 새 개체로 변환됩니다.

나는 이것이 나쁜 디자인이라고 생각하지만 어떻게 개선 할 수 있습니까? IStoredProecedureObject저장 프로 시저가 반환하는 모든 데이터 유형에 공통 기본 유형을 제공하는 것과 같은 빈 인터페이스를 추가하는 것을 고려 했지만 Entity Framework에 의해 실패한 것으로 보입니다. .edmx파일을 다시 컴파일 할 때마다 코드가 새로 생성되고 추가 된 내용이 제거됩니다. 이 일을 막을 방법이 있습니까?

이 디자인을 어떻게 개선 할 수 있습니까? 무엇이 잘못 되었습니까? 아니면 내가 올바른 길을 가고 있습니까?

답변:


6

면책 조항 : 엔티티 프레임 워크를 사용하지 않으며 거의 ​​모든 데이터베이스 도우미 프레임 워크에 대해 크게 편향되어 있습니다.

래퍼를 만든 것 같습니다.

"래퍼"와 "레이어"를 구별합니다. 레이어는 자신의 DLL / 프로젝트 / JAR / 무엇이든 컴파일 할 수있는 것입니다. 데이터 액세스 계층 래퍼는 해당 DLL 내에서 사용하는 "도우미"클래스입니다. 인터페이스를 단순화하거나 중복을 제거 할 수 있습니다.

데이터베이스 액세스 인터페이스를 단순화하는 문제는 일반적으로 간단하지 않다는 것입니다. ADO / JDBC / etc의 인터페이스를 복제하게됩니다. 아니면 사람들이 그것을 우회하도록 강요합니다. 래퍼는 모든 종류의 원치 않는 일을하는 경향이 있습니다. 트랜잭션을 지원하기 위해 열어야 할 때 자동으로 연결을 닫을 수 있습니다. 데이터를 스트리밍해야하고 가비지 수집 언어 중 하나를 사용하는 경우 종종 연결을 열어 둡니다. 랩퍼 뒤에 라이브러리의 모든 기능을 제공하려면 라이브러리를 복제해야합니다.

ADO / JDBC와 같은 라이브러리는 이미 훌륭한 인터페이스입니다. 그것들은 OOP의 가장 훌륭한 예 중 일부입니다. 나는 wizbang이 모자에서 뽑은 포장지 위에 그들을 사용하는 것을 선호합니다.

고전적인 JDBC / ADO 스타일 인터페이스는 잘 알려져 있고 이해되어 있습니다. 모자에서 꺼낸 포장지는 그렇지 않습니다.

중복 "paramters.Add"를 줄이고 싶습니까? 제네릭을 살펴보십시오. 또는 "paramter.Add"를 줄임으로써 실제로 ".add"를 다른 코드 레이어로 푸시하면됩니다.

BTW 이것은 좋은 질문입니다. 내가 할 수 있다면 나는 그것을 10 번 공언했다.

편집 : 물론 JDBC 코드는 데이터 액세스 계층에 숨겨져 있습니다.


나는이 사실이 EF 4를 둘러싼 포장지보다 더 가혹하다는 데 동의한다. 그 뒤에 숨겨진 아이디어는 표준 데이터 모델과 같은 다양한 데이터베이스 연결을 재사용하는 동시에 각각 재사용 성 특성을 가진 여러 데이터베이스에 대한 단일 진입 점을 갖도록하는 것입니다. 이 데이터베이스 랩퍼는 별도의 라이브러리 (다른 비즈니스 로직과 함께)로 컴파일됩니다. 디자인을 개선하여 디자인을 개선하도록 제안하는 방법은 무엇입니까?
Andy Hunt

EF는 DB 헬퍼 프레임 워크 이상이지만 EF 바이어스에도 불구하고 훌륭한 콘텐츠에 +1합니다. 당신은 그의 래퍼를 만들려고 노력하고 있습니다.
SoylentGray
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.