2011-04-26 2 views
10

DAO 데이터 액세스 개체는 .NET에서 일반적으로 사용되는 패턴입니까? 필자는 데이터 영역에 대한 액세스를 제공하기 위해 항상 DAO를 사용했습니다. 예를 들어, 모든 ObjectSet을 IObjectSet으로 노출시키는 EntityFramework ObjectContext에 대해가는 인터페이스가있을 수 있습니다.DAO 패턴은 .NET에서 널리 사용됩니까?

그런 다음 복잡한 쿼리는 DAO에 의해 노출 될 것이며, 각 쿼리는이 인터페이스에 종속됩니다. GetProductsOnSale() 또는 GetInfrequenlySoldProducts()과 같은 메서드를 제공하는 ProductDAO가있을 수 있습니다. 컨트롤러 또는 발표자는 이러한 방법을 사용합니다.이 방법은 단위 테스트에 대해 특정 결과를 스터 빙할 수있는 가상의 가능성이 높습니다.

.NET에서 일반적으로 사용되는 관용구입니까? 어떤 이유로이 패턴을 사용하여 온라인으로 볼 수있는 예제의 대부분이 Java를 기반으로합니다. DAO 모범 사례에 대한 this question조차도 C#이 아닌 Java로 태그가 지정됩니다. 다른 커뮤니티에서 뭔가를 사용하여 아무 문제가 없습니다

은, 난 그냥 내 주변의 모든 사람들이 다른 일을하는 것이 약간의 두려움 ...

답변

8

그것은 .NET에서 일반적인 관용구이다 있습니다. 나는 그것을 사용했고 그것을 여러 곳에서 사용하는 것을 보았다.

System.Data 네임 스페이스 참조 - 많은 클래스가 특수한 공급자 (SQL Server, Oracle, MySQL ... 등)의 기본 클래스이며 작업이 기본 클래스에서 실행됩니다.

그러나 설명하는 내용은 을 단순히 사용하는 것이 아니라 Repository Pattern처럼 들립니다.

이것은 프레임 워크에 내장되어 있지 않지만 많은 프로젝트에서도 사용됩니다.

+0

나의 이해는 저장소가 모든'IObjectSet '멤버를 노출은 "것"이라고이며, DAO는 쿼리를 구축하기 위해 저장소를 사용하는 클래스입니다. 그것은 당신이 그 용어를 사용하는 방법과 일치합니까? –

+1

@ 아담이 - 아니, 정말은'DAO' 실제 DB 인터페이스를 _abstracts_ 무엇의'Repository'가되어 '메모리'컬렉션을 대표하는'DAO'의 사용을 추상화 것입니다. 알았어. – Oded

+0

. 저장소의 인스턴스를 가져 와서 복잡한 쿼리를 노출하는 객체를 어떻게 부르겠습니까? 간단한 인터페이스 뒤에 복잡한 상호 작용을 조정 뭔가 - - 확실히 내가이 일을 꽤 꽤 빨리 –

1

나는 DAO 패턴을 광범위하게 사용합니다.

Entity Framework에 대해 언급했습니다. DAO가 DataSets 및 DataTables보다 훨씬 뛰어나다는 점을 덧붙이겠습니다. 데이터베이스와 너무 흡사해서 내 취향에 맞는 개체가 아닙니다. 예를 들어 DataRow는 둘 이상의 데이터 테이블에 추가 될 수 없으므로로드 된 데이터의 하위 집합을 다른 개체에 전달할 수 없습니다. 포함되지 않은 컨테이너로 이동하지는 않습니다. (즉, DataRow가 DataTable에 있어야하는 것처럼 보이지만 한 번에 하나의 DataTable에만있을 수 있습니다.) DataRowView는 복잡하고 엔티티 개체를 다른 목록에 추가하는 것처럼 직관적이지 않습니다.

1

데이터 액세스를 캡슐화하기위한 리포지토리 패턴 (실제로는 매우 좋은 패턴) 사용에 대한 가장 큰 권장 사항은 일반 리포지토리를 만들 수 있다는 것입니다. 그러나 매우 똑똑한 일반 저장소를 만들면 기본적으로 모든 표준 CRUD 작업에 즉각적으로 액세스 할 수 있고 복잡한 쿼리 구성에 액세스하여 ISomeService 외관을 노출 할 수 있습니다.

제네릭 리포지토리를 사용할 때 가장 중요한 점은 상속에 기반하지 않고 생성자 삽입을 기반으로해야한다는 것입니다. 이 방법을 사용하면 SomeService이 의미있는 비즈니스 도메인 경계를 충족시키는 데 필요한 많은 일반 리포지토리에 종속되도록 작성할 수 있습니다.

이 개념에 대한 블로그를 작성했습니다. Creating a common generic and extensible NHiberate Repository version 2. 이 블로그 게시물은 NHibernate의 참조에서 특정이지만 동일한 코어 개념을 사용하여 거의 모든 DAO에 적용 할 수 있습니다.

Entity Framework, Linq2Sql 및 RavenDB와 같은 일부 도구는 매우 정교한 저장소를 노출하므로 추가 래퍼를 추가 할 필요가 없습니다.