2010-05-26 3 views
2

나는 작업하고있는 새로운 구현을 위해 Linq to SQL을 사용 해왔다. 나는 약 5000 줄의 코드를 가지고 있으며 솔리드 데모에서 약간의 방법을 사용하고있다. 필자는 Linq to SQL에 대해 지금까지 매우 만족해했습니다. 도구는 훌륭하고 꽤 고통 스럽습니다. 그리고 DAL을 빠르게 설치하고 실행할 수 있습니다.Linq to SQL 아키텍처를 보여주세요!

그건 그렇고, 내가 계속해서 몇 번이나 계속해서 반복하는 몇 가지 주요 단점이 있습니다. 즉, DAL과 비즈니스 계층 간의 관심사를 어떻게 처리하고 서로 다른 데이터 컨텍스트로 저글링을 수행 할 것인가.

다음은 내가 사용해온 아키텍처입니다. 제 저장소는 모든 데이터 액세스를 수행하고 Linq를 SQL 객체로 반환합니다. 각 Linq to SQL 객체는 IDetachable 인터페이스를 구현합니다.

partial class PaymentDetail : IDetachable 
{ 
    #region IDetachable Members 

    public bool IsAttached 
    { 
     get { return PropertyChanging != null; } 
    } 

    public void Detach() 
    { 
     if (IsAttached) 
     { 
      PropertyChanged = null; 
      PropertyChanging = null; 

      Transaction.Detach(); 
     } 
    } 

    #endregion 
} 

나는 내가 객체와 끝났어요 (그리고 이론적으로 모든 자식 개체에서 분리해야) 할 때 "분리"내 저장소에서 DAL 작업을 할 때마다이를 제거하려면 : 일반적인 구현은 다음과 같습니다 DataContext의 문맥.

내가 말했듯이, 이것은 꽤 잘 작동하지만, 엉덩이에 큰 고통을 줄 수있는 가장자리 경우가 있습니다. 예를 들어, 내 Transaction 객체에는 많은 PaymentDetails가 있습니다. 이 없더라도 해당 컬렉션에있는 PaymentDetails는 여전히 DataContext의 컨텍스트에 연결되어 있습니다! 따라서 업데이트하려고하면 (Attach()) 개체 및 다음 SubmitChanges()로 업데이트 할 때 나는 두려워하게됩니다 "Attach가 시도되었거나 새로운 개체가 아닌 개체를 추가하려고 시도했을 수 있습니다. 다른 DataContext. 이것은 지원되지 않습니다. " 메시지.

어쨌든, 나는이 기술이 좋은 도박 이었다는 것을 의심하기 시작했습니다. 누구나 공유 할 의사가있는 괜찮은 아키텍처가 있습니까? 정말이 기술을 사용하고 싶지만 시간의 1/3을 소비하는 것처럼 느껴집니다. 디버깅은 지체 된 단점입니다!

+0

질문이 어디에 있습니까? –

+0

실제로는 질문이 아니기 때문에 커뮤니티 위키가되어야합니다. – Donnie

+0

죄송합니다, 예, 아마도 위키에 있어야합니다. –

답변

1

DataContext의 수명은 "작업 단위 (Unit of Work)"의 수명이어야합니다.

예 :

  1. 은에서 대상 계정에
  2. 빼기 돈을 돈을 추가이것은 원자 거래에서 두 단계를 포함 다른

    에 하나 개의 계정에서 돈을 이동 소스 계정

귀하의 DataContext shou 1 단계 후에 스스로 분리하지 마십시오. 두 단계가 모두 완료 될 때까지 살아 있어야합니다.

+1

그러나 이것은 더 "엔지니어링 된"환경에서 실제로 의미가 있지 않습니까? 즉 각각 서로에 대한 참조가있는 여러 객체, 트랜잭션 저장소, 고객 저장소 등에서 설명하는 모델을 어떻게 적용 할 수 있습니까? –

+1

릭 스트 렐 (Rick Strahl)은이 문제에 대한 꽤 좋은 시험을 여기서 작성했습니다 : http://www.west-wind.com/weblog/posts/246222.aspx –

+0

@ 브래드 : 여러 저장소를 사용하는 경우 모두 배후의 동일한 데이터 컨텍스트 개체에서 작업 할 수 있습니다. 일반적으로 저장소 스타일 추상화를 사용하고 동시에 여러 저장소로 작업하는 응용 프로그램은 저장소를 함께 바인딩하기 위해 IUnitOfWork 추상화를 수행합니다. – OdeToCode

1

저는 개인적으로 모든 CRUD 메서드에 대해 "using"블록 내에서만 DataContext를 사용합니다.

Detach()를 사용하는 더 간단한 방법이 있습니다. 엔티티를 저장할 때만 사용합니다. 업데이트가 정상적으로 작동합니다. 언급 한 두려운 오류를 "수정"하는 방법에 대한 온라인 기사는 거의 없지만 DAL이 제대로 설계된 경험이 없으면 전혀 수행 할 필요가 없습니다.

지연로드를 설정하여 관련 데이터를로드하지 않으며 한 번에 하나의 엔티티 (예 : Order, Customer, Item)로 작업합니다.

여러 항목의 순서를 저장하면 항목을 반복하고 각 항목 메서드에서 .Save()를 호출합니다. Save 메서드는 개체의 ID를 기반으로 업데이트 또는 삽입 여부를 결정합니다.

또한 동시성에 타임 스탬프를 사용하는 것은 이전 개체와 새 개체를 비교하는 것보다 훨씬 쉽고 효율적으로 수행되는 것 같습니다.