2010-05-17 1 views
4

매우 큰 ASP.NET MVC 프로젝트를 매우 빨리 개발해야하며 DAL 디자인에 대한 의견을 듣고 싶습니다. BL은 꽤 복잡해질 수 있습니다. 약간의 배경 지식 : 오라클 백엔드와 함께 SQL에 내장 된 LINQ를 사용하고 있습니다. Oracle EF 제공자 프로젝트가 종료 될 수 있도록 프로덕션 레벨 라이브러리를 사용해야합니다. 마지막으로, 나는 어떤 GPL 또는 LGPL 코드 (아파치, MS-PL, BSD도 괜찮다)를 사용할 수 없으므로 NHibernate/Castle 프로젝트가 종료되었다. 나는 가능한 한 돈을 버는 것을 피하기를 원하지만, 올바른 해결책을 구현하는 것이 더 중요합니다.POCO에 대한 DataSets - DAL 아키텍처에 대한 문의

나는 합리적으로 행복 해요

  1. 오라클 백엔드
  2. (L) GPL없는

  3. 무료 신속한 개발 : 요약하면, 내 요구 사항이 있습니다 DataSets하지만 데이터 세트와 뷰 사이의 중개자로 POCO를 사용하면 도움이 될 것입니다. 누가 어떤 지점에서 다른 DAL 솔루션이 나타날지 알 수 있습니다. 그러면 전환 할 시간이 생깁니다 (예, 맞습니다). 따라서 LINQ를 사용하여 DataSet을 IQueryable로 변환 할 수는 있지만 일반적인 솔루션이 필요하므로 각 클래스에 대한 사용자 지정 쿼리를 작성할 필요가 없습니다.

    나는 두 가지 질문을 가지고 있지만 그 동안, 지금 반사 땜질 해요 :

    1. 거기에 나는이 솔루션을 간과 문제?
    2. 데이터 세트를 POCO로 변환하는 다른 방법이 있습니까?

    미리 감사드립니다.

+1

NHibernate는 GPL이 아니며 LGPL입니다. 큰 차이. 성은 아파치 2입니다. –

+0

GPL과 LGPL은 매우 다르지만 제 목적에는 사용할 수 없습니다. 나는 NHibernate 위에 구축 되었기 때문에 같은 문장에 성을 넣었다. – alexsome

+3

이것은 훌륭한 질문이며 소프트웨어 엔지니어링의 핵심 부분에 실제로 도달합니다. 바로 이것이 당신의 BL과 DAL 연결 방법을 정확하게 결정하는 방법입니다. 당신은 사람들이 그것을 다르게한다는 것을 알게 될 것이고, 대부분의 사람들은 그것을 "올바른"방식으로하고 있다고 확신 할 것입니다. –

답변

3

답변이 없지만 나에게 줄 것을 시도하는 사람들을 찾을 수 있습니다. 몇 가지 유의해야 할 사항은 다음과 같습니다

  • 당신이 EF 또는 Linq에 - 투 - SQL의 장점을 얻을 수 있기 때문에, IQuerable 인터페이스를 사용에 대해 걱정하지 마십시오; 당신은 그것의 주요 이점을 얻지 못할 것입니다. 물론, 일단 pocos를 얻으면, LINQ를 반대하는 것은 그것들을 다루는 좋은 방법이 될 것입니다! 많은 보관 메소드는 IQueryable<yourType>을 반환합니다.

  • 귀하의 pocos를 반품하는 데 좋은 repository 인 경우 반성을 사용하여 반납하면 처음에 a good strategy이됩니다. 잘 캡슐화 된 저장소가 있다면 다시 말합니다. 나중에 더 효율적인 코드를 위해 반사 된 채워진 엔티티 개체 코드를 전환 할 수 있으며 BL의 어떤 것도 그 차이를 알 수 없습니다. 에 똑바로 리플렉션하면 (nHibernate와 같은 optimized reflection이 아님) 나중에 비효율적 일 수 있습니다.

  • 나는 T4 templates을 살펴볼 것을 제안합니다. 몇 달 전에 T4 템플릿에서 엔티티 클래스 (그리고 이들을 채우고 유지하는 데 필요한 모든 코드)를 처음 생성했습니다. 나는 팔렸다! 내 T4 템플릿의 코드는이 첫번째 시도에서 꽤 무서운데, 좋은 코드, 일관된 코드가 나온다.

  • 리포지토리 방법에 대한 계획을 세우고 팀에서 만드는 모든 방법을 면밀히 모니터링해야합니다. 항상 .GetOrders() 메서드를 사용할 수 없습니다. 모두 때마다 고객이 발생하므로 개체에 대한 LINQ가 좋게 보이지만 잘못된 데이터 액세스가 포함됩니다. .GetOrderById(int OrderID).GetOrderByCustomer(int CustomerID)과 같은 방법이 있습니다. 엔터티를 반환하는 각 메서드가 최소한 DB에서 인덱스를 사용하는지 확인하십시오. 기본 쿼리가 을 반환하면 레코드가 낭비됩니다.하지만 테이블 스캔은 수행 할 수 없으며 수천 개의 낭비 된 레코드를 반환 할 수 없습니다.

예 :이 예에서

var Order = From O in rOrders.GetOrderByCustomer(CustID)  
      Where O.OrderDate > PromoBeginDate  
      Select O 

는 고객에 대한 모든 주문은 주문의 일부를 얻을 수, 검색 할 수있다. 그러나 엄청난 양의 낭비가 없으며 고객 ID는 반드시 주문의 인덱싱 된 필드 여야합니다. 이 방법이 수용 가능한지 또는 저장소에 날짜 구별을 추가 할지를 새로운 방법으로할지 아니면 다른 방법으로 오버로드 할지를 결정해야합니다. 이에 대한 지름길은 없습니다. 당신은 효율성과 데이터 추상화 사이의 경계를 걸어 왔습니다. 전체 솔루션에서 모든 단일 데이터 조회를 위해 저장소에 메소드를 갖고 싶지는 않습니다.

명이 작업을 수행하는 방법에 정확하게 씨름 어디 내가 찾은 일부 최근 기사

는 다음 수,

+0

예, 저는 주로 LINQ를 사용하여 편리하게 반복합니다. 의견을 보내 주셔서 감사합니다. – alexsome

+0

편집에 대한 응답으로 : 나는 낭비되는 레코드를 완전히 동의합니다. 조숙 한 최적화에 대한 강한 욕구를 제어해야합니다. T4 템플릿은 매우 유용 할 수 있습니다. 다시 한번 감사드립니다. – alexsome

+0

마지막으로 한 가지 덧글 : 실수로 upvote 단추를 두 번 클릭하여 upvote를 취소했습니다. 불행히도 내 표결이 잠겼습니다. 게시물을 편집하면 기분을 상하게합니다. – alexsome

2

Devart dotConnect for Oracle 엔티티 프레임 워크를 지원 .: 엔티티에 LINQ를 사용합니다.

+0

나는 차라리 무료로 가고 싶지만, 분명히 이것을 명심 할 것입니다. 감사. – alexsome

1

리버스를 사용하여 데이터 집합에서 DTO를 작성하는 것에 대해 걱정하지 마십시오. 그들은 위대한 일을합니다.

통증 영역은 각 비즈니스 개체에 대한 IComparer 구현입니다. 프레젠테이션 계층에서 최소 요구 사항 인 데이터 만로드하십시오. 나는 메모리 정렬에 내 손가락을 심하게 불 태웠다.

또한 DTO에서 지연로드를 미리 계획하십시오.

우리는 generic 라이브러리에서 datatable/datarow를 entitycollection/entityobjects로 변환했습니다. 그리고 그들은 꽤 빨리 일합니다.

+0

팁 주셔서 감사. 최소한의 데이터 만 남을 계획입니다. DTO에 대한 의미가 "훌륭하게 작동합니다"라고 이해하는지 잘 모르겠습니다. 리플렉션을 사용하는 대신 각 POCO에 대한 쿼리를 작성해야한다고 제안하는 중입니까? 그건 분명 합리적입니다 - 방금 코드의 양을 최소화하고 싶었습니다. 이 시점에서 최적화는 중요하지 않으며 잠시 동안은 그렇지 않을 수도 있습니다. – alexsome

+0

당신은 비즈니스 오브젝트와 데이터 세트/데이터 테이블/데이터rows에서 이러한 오브젝트의 콜렉션을 런타임에 빌드하여 비즈니스에서 전달할 필요가 있습니다. 레이어를 상호 작용 레이어에 추가합니다. 우리는 이러한 자동화를 위해 리플렉션을 사용했습니다. DTOs a.k.a.를 비즈니스 객체로 사용합니다. –

+0

@tcg - DTO와 비즈니스 객체가 같은 것이라고 생각하지 않습니다. 비즈니스 객체에 코드가 전혀 없습니까? –