2014-05-21 7 views
1

기존 응용 프로그램의 새로운 아키텍처를 위해이 모든 것을 통합하려고합니다. 기존 응용 프로그램에는 많은 비즈니스 로직이 있으므로 어니언 아키텍처 (계층 적, 분리 된)가 올바른 솔루션이 될 수 있다고 생각했습니다. - Repo/UoW ORM) 패턴 (또는 DAL 또는 실제로 데이터베이스에 연결되는 레이어가 호출되는 모든 것)에 따라 달라집니다. http://msdn.microsoft.com/en-us/library/dn314429.aspxEF6 및 양파 아키텍처 - 저장소 패턴이없는 첫 번째 데이터베이스

-

  • EF6 멋지게 단위는 다음과 같이 경계로 DbContexts을 구현하는 리포 패턴없이 테스트 할 수 있습니다하지만 때문에 내 경우에는 환매 약정 (EF의 위쪽)/UOW이 필요하다는 것을 확실하지 않다

  • 대부분의 일반 리포 예는

  • 비 일반적인 레 포스가 많은 코드를 야기하는 경향이 그들이 LINQ 쿼리를 동의 방법 (표현처럼> 쿼리)를 노출하기 때문에, 새는 추상화를 사용하는 경향이

여기에 몇 가지 질문이 있습니다 :

1) 대부분의 예제는 EF 코드와 코어 레이어의 POCO 객체를 사용하지만 데이터베이스를 먼저 사용하고 모델을 생성해야합니다. 코어에서 EF 생성 .edmx 모델을 사용할 수 있습니까? 그렇지 않으면 데이터 액세스에 불필요한 결합이 생깁니 까? EF에서 생성 된 클래스 (테이블 필드가있는 .cs 파일)를 EF에서 생성 된 데이터 액세스 코드 (context.tt 파일 등)로 분할하는 방법이 있습니까? 내가 대신 저장소 인터페이스의,이 의미

public class OrderService(IMyDbContext) { ... } 

의존성으로 전달되는 경계 DbContext 인터페이스와 같은 서비스 레이어()를 구현할 계획입니다

2), DbSets와 DbContext 래퍼 인터페이스가있을 것입니다 . 단위 테스트는 모의 IMyDbContext와 모의 IDataSet을 사용하여 수행 할 수 있습니다. 데이터베이스 추상화라는 전체 개념을 능가하지 않습니까? 이것은 단위 테스트를하기에 충분하지만 아키텍처 측면에서 보면 괜찮은가요? Repo/UoW (EF 상단에 있음) 패턴이 제공하는 멋진 기능이 누락 되었습니까? http://www.wekeroad.com/2014/03/04/repositories-and-unitofwork-are-not-a-good-idea/

http://lostechies.com/jimmybogard/2012/10/08/favor-query-objects-over-repositories/

하지만 난 정말 양파 + 쿼리 개체와 예제를 발견하지 않았습니다 :

3) 저장소에 대한 하나 개의 대안 (비록되지 매우 인기가) 쿼리 개체 것 같다. 이것이 리포지토리 인터페이스 계층에 대한 합리적인 선택 일 수 있습니까? 대신 쿼리 인터페이스 배치 및 인터페이스 (데이터 액세스) 계층의 쿼리 구현? QueryObjects 내에 모든 데이터 액세스 로직을 배치해야합니까? DbContext.Where를 Coltroller/Service 계층에서 직접 쿼리하면 데이터 액세스와 비즈니스 논리 간의 불필요한 결합이 발생합니까?

+0

귀하의 질문에 흥미롭고 관련성이 있지만, StackOverflow Q & A 형식에는 너무 광범위합니다. –

+0

아마도이 Q는 http://codereview.stackexchange.com에서 더 적합합니다. –

답변

3

@andree 나는이 토론에 추가 할 수있는 몇 가지 의견이있다. 나는 이것이 더 오래된 쓰레드라고 생각하지만 토론은 여전히 ​​가치 있다고 생각한다.

먼저 EDMX 파일을 사용하지 않는 것이 좋습니다. EF7에 대한 이후의 모든 논의는 EDMX가 삭제 될 것임을 나타냅니다. 대신 EF6.1부터 기존 데이터베이스에서 "코드 우선"스타일 구성을 생성 할 수 있습니다.

"코드 - 최초의"아마 이름을 변경해야

대부분의 일반 리포 예들은 (표현> 쿼리 등) LINQ를 동의 방법> 쿼리를 노출하기 때문에, 새는 추상화를 사용하는 경향이있다 "유창하게 구성"

비 일반적인 레 포스 나는 일반적으로 조금 "새는"수하는 것이 유용 할 수 있다는 것을 발견 한 코드

를 많이 유발하는 경향이있다. 우리는 IQueryable을 공유하는 저장소를 사용하여 빠른 쿼리를 작성하기 쉽습니다. 그러나 자주 사용되는 모든 항목은 적절한 저장소로 옮겨집니다. 분명히 이것은 지속성 레이어를 IQueryable을 제공 할 수없는 다른 것으로 바꾸기가 더 어려워 질 것입니다. 그러나 실제로 이것은 결코 발생하지 않았습니다.

"제네릭이 아닌 Repos는 많은 코드를 발생시키는 경향이 있습니다."라는 문제는 .tt 템플릿으로 코드 생성을 사용하는 것이 문제였습니다. - tt 템플릿은 부분 저장소 구현과 인터페이스를 생성합니다. - 그런 다음 자신 만의 부분 파일에 직접 메서드를 추가하십시오.

은이 라이브러리에서 봐 주시기 바랍니다 :
http://www.sswdataonion.com
(면책 조항 :이의 개발자 중 하나)
그것은 저장소와 작업 단위 패턴을 생성하기 TT 템플릿이 포함되어 있습니다.

개인적으로 진정으로 불가 지론적인 "누수가없는"서비스 계층을 작성한다면 저장소/작업 단위 (Unit of Work) 패턴 위에 레이어로 작성해야합니다.