2010-03-22 9 views
1

내 시스템에서 DataContext를 생성해야하는 레이어를 결정하는 데 문제가 있습니다. 모든 데이터베이스 업데이트에 대해 동일한 DataContext 개체를 전달하지 않으면 때때로 DataContext에서 예외가 발생한다는 내용의 책을 읽었습니다. 이것이 바로 비즈니스 계층에서 DataContext의 새로운 인스턴스를 만들고 데이터 액세스 레이어로 전달하는 이유입니다. 따라서 모든 업데이트에 동일한 datacontext가 사용됩니다. 그러나 이것은 하나의 디자인 문제로 이어집니다. 미래의 Non-LinqToSQL으로 DAL을 변경하고 싶다면 비즈니스 계층에도 코드를 다시 작성해야합니다. 이것에 대해 조언 해주세요. 감사.DataContext를 생성해야하는 계층은 무엇입니까?

예제 코드

비즈니스 로직 계층 (BLL)의 일부를 저장 (DB, XML, 디스크 등)에 I/O를 필요로
'Business Layer 
Public Sub SaveData(name As String) 
Using ts AS New TransactionScope() 
Using db As New MyDataContext() 
    DAL.Insert(db,name) 
    DAL.Insert(db,name) 
End Using 
ts.Complete() 
End Using 
End Sub 

'Data Access Layer 
Public Sub Insert(db as MyDataContext,name As string) 
    db.TableAInsert(name) 
End Sub 

답변

1

IMHO, 데이터 액세스 레이어를 가지고 최선의 방법 (DAL) 당신이 그것을 바꿀지도 모르기 때문에, 당신은 캐싱을 제어하고 싶어한다. 그래서 실제로, BLL은 DAL (인터페이스)와의 계약 인 DataContext를 가져서는 안된다.

2

LINQ to SQL에 밀접하게 결합 된 DataContext이므로 DAL에서 확실히 만들어야합니다.

나는이 somewhat related SO question에 제공된 대답을보십시오. DataContext (Entity Framework의 ObjectContext)를 여러 데이터베이스 작업에 걸쳐 유지해야하는지, 아니면 임시로 생성하고 폐기해야하는지 같은 문제가 발생합니다.

당신이 말하는 문제는 model objects retrieved through a DataContext can only be updated using the same DataContext instance과 관련이 있습니다. 이제 원래 DataContext가 삭제 된 경우 업데이트 된 모델 객체를 새 DataContext 인스턴스에 연결하려는 시도가 실패합니다.

그러나 이것은 응용 프로그램의 아키텍처에 따라 반드시 문제가되는 것은 아닙니다.
예를 들어, LINQ to SQL을 통해 검색 및 조작 된 모델 개체가 클라이언트 (웹 응용 프로그램 또는 웹 서비스)에서 앞뒤로 직렬화되는 경우 업데이트 된 개체는 원래 있던 개체와 결코 동일하지 않습니다 검색 됨. 이 경우 안전하게 새 DataContext에 연결할 수 있습니다.

0

언제나 그렇듯이, 당신의 특별한 경우에 따라 다르지만, 당신이 Hibernate 나 ObjectContext를 사용한다면 DataContext (또는 당신의 Session)을 생성/제출/포기하도록 조언 할 것입니다. EDM)을 프리젠 테이션과 비즈니스 로직 사이에있는 얇은 외관에 적용합니다. 이 서비스 레이어의 응용 프로그램 계층이라고도합니다.

그게 지금은 어땠어. 좋은 경험적 방법은 AOP를 사용하여 작업을 완료해야한다고 말합니다. 그리고 AOP에 의해 나는 거대한 뚱뚱한 AOP 전용 프레임 워크를 의미하지는 않습니다. 거의 모든 프리젠 테이션 및 웹 서비스 프레임 워크는 일부 AOP 기능을 제공하여 비즈니스 코드가 실행되기 전후에 몇 가지 작업을 수행 할 수 있습니다 (예 : ASP.NET의 IHttpModule 및 WCF의 IDispatchMessageInspector). 이전에 프레임 워크에 연결하고 DataContext를 만들었습니다.

DAL을 변경해야하는 경우 DAL 변경 및 DAL 변경을 만들거나 제출하는 데 사용한 코드 만 변경해야합니다. 실제로 AOP 주입 코드는 DAL 어셈블리에 배치되어야하며 가능하면 부트 스트랩 루틴에서 구성되어야합니다.

관련 문제