2012-04-25 8 views
3

최근에 내가 생산에 투입 한 프로젝트에서 데이터 액세스를 다시 엔지니어링하는 작업을 해왔습니다.엔티티 프레임 워크, 리포지토리 패턴, 작업 단위 및 작업 단위

나는 Repository와 Unit of Work 패턴에 대해 읽기 시작했고, 흥미를 끌었다. 이전에는 TDD를 사용하지 않았지만 한 번 시도해 보겠다고 생각했습니다.

제가 작업하고있는 것이 중요하지 않으므로 더 나은 이해를 얻는 것이 더 취미가됩니다.

나는 작업하고 있지만 마크를 완전히 놓친 지보고 싶어합니다. 여기에 내가 가진 무엇 ... 그 점을 제외하고 같은 모든 본질적으로을 ...

Sln.DataAccess 
+ Entities 
    + Person.cs (contains the model definition of a Person) 
    + IIdentifiedObject.cs (just an interface demanding a (Guid)Id property) 
+ Repositories 
    + IRepository.cs[1] 
+ IUnitOfWork.cs[2] 

Sln.DataAccess.Memory 
+ PersonRepository.cs[3] 
+ Context.cs[4] 
+ GenericRepository.cs[5] 
+ UnitOfWork.cs[6] 

Sln.DataAccess.Sql (I suppose this could be Sln.DataAccess.EF but anyway...) 
+ PersonRepository.cs 
+ Context.cs 
+ GenericRepository.cs 
+ UnitOfWork.cs 

Sln.Test 
+ Various unit tests. 

은 SQL 컨텍스트/저장소/등 (내가 대신 단순위한 솔루션의 이름의 SLN를 사용합니다)입니다 메모리 내 목록 대신 Entity Framework를 통해 데이터베이스에 액세스하십시오.

내가 묻는 진짜 질문은 내가 전체 Repository/UnitOfWork 패턴에서 표시를 놓쳤는 지 또는 내가 가진 것에 대해 개선 할 수있는 사람이 줄 수있는 제안이 있는지 여부입니다.

다음은 소스 파일입니다.

+0

올바른 저장소 유형을 생성하기위한'RepositoryFactory'도 포함 시켰습니다. – mellamokb

+0

어디에 앉으시겠습니까? 내가하려는 것은 데이터 액세스에서 데이터 정의를 완전히 추상화하는 것입니다. 따라서 .Memory와 .Sql 어셈블리가 분리되어있는 이유는 무엇입니까? .ememory assembly는 결코 생산에 포함되지 않을 것입니다 **. – Brendan

답변

0

좋아, 그래서 내가 원하는 것을 얻었습니다.

내가 만든 프로젝트 (위가 열려 있어야 함)와 내가 원하는 것을 정확하게 보여주는이 프로젝트를 참조하십시오.

Sln.DataAccess 어셈블리에는 실제로 데이터가 저장되는 방법, 클래스가 없으며 개체 액세스 방법 및 이러한 개체의 구조를 정의하는 인터페이스 만있는 0 개의 참조가 있습니다.

실제 지속성의 수단 (메모리 내 또는 데이터베이스)은 해당 어셈블리 외부에서 완전히 숨겨집니다.https://github.com/bmckenzie/projects/blob/development/Projects.DataAccess.Memory/Context.cs

차라리 if() {} 것을 피하고의 일종을 사용 : 내가 해결하고 싶은

https://github.com/bmckenzie/projects

것은 내 메모리 컨텍스트 클래스의 Set<>() 방법은 여기를 살펴입니다 사전에 누구 한테 제안이 있다면?

+0

그래, 나는 또한 그것을 고쳤다. – Brendan

+0

나는 누군가에게 어떤 용도의 것이라면 내가 성취하려고 시도했던 것에 대해 간단한 블로그 게시물을 작성했습니다 ... http://brendanmckenzie.com/blog/post/2012/04/26/entity-framework-unit- testing-and-the-repository-pattern.aspx – Brendan

+0

지금 ... http://brendanmckenzie.com/2012/04/entity-framework-unit-testing-repository-pattern – Brendan

1

표준 WA가 없습니다. y 저장소를 수행합니다. 무언가를으로 추상화 할 예정이지만 다른 사람들에게는 뭔가 다를 수 있습니다. 어떤 사람들은 일반적인 질의 방법을 가지고 있으며, 어떤 사람들은 repo 자체에서 특수한 질의만을 가지고 있습니다.

먼저 유스 케이스를 생각해보고 해당 유스 케이스에서 작동하도록 리포지토리를 디자인하십시오. 주소록 응용 프로그램을 디자인하고 저장소가 필요한 기능을 편리한 방식으로 제공 할 수 있다고 생각하십시오.

+0

나는 내가 무엇을 찾고 있는지는 내가 더 잘 할 수있는 방법에 대한 제안이라고 생각했다. 내가 한 일은 각 엔티티에 대해 IRepository로부터 상속받는 인터페이스를 갖는 것이 었습니다.하지만 과도하게 죽이든 아니든 확실하지 않았습니다. 또한 내가하고 싶은건 어떻게 든 .DataAccess 네임 스페이스에서 Context (두 구현에 사용됨)를 가질 수 있지만 DbSet <>에 EF를 단단히 연결하면 불가능해진다. – Brendan

+0

일반 쿼리 () 메서드를 만들 수 있습니다. return context.Set () .AsQueryable(); 그렇게하면 작업 단위당 하나의 repo (그리고 단 하나의 인스턴스) 만 있으면됩니다. 그런 식으로 조인을 할 수도 있습니다. – usr

관련 문제