2011-03-18 4 views
0

Windows Forms에서 소규모 데이터 집약적 인 응용 프로그램을 구축하고 있습니다. 기본 프로젝트에서 데이터베이스에 대한 CRUD 작업을 제공하기 위해 데이터 클래스뿐만 아니라 내 DBML을 보유하는 폴더가 있습니다. 현재 약 10 개의 데이터 클래스가 있습니다.데이터 액세스 및 데이터 액세스 클래스 디자인 개선

양식의 코드 뒤에는 비즈니스 개체가 인스턴스화되고 모든 작업을 수행하도록 호출됩니다. 이 Business Object는 정적 데이터 액세스 클래스를 호출합니다.

데이터 클래스의 예는 지금 분명히 내가 해결해야 내 초기 설계에 몇 가지 문제가이

static class CustomerData 
{ 
    public static IEnumerable<Customer> GetCustomersForRun(int runID) 
    { 
     var db = new FooDataContext("connectionString"); 
     return db.Customers.Where(ri => ri.RunID == runID); 
    } 
} 

같은 것입니다.

1) 각 정적 메서드에 자체 DataContext를 만들어야하는 것은 좋지 않습니다. 이것은 전혀 건조하지 않은 것 같습니다.

2) 일부 게으른 로딩에 의존하기 때문에 using 문에서 DataContext를 래핑 할 수 없습니다.

나는이 문제를 해결해야 할 다른 생각의 몇

1)

는 정적 메소드를 제거하고 대신 내의 DataContext를 인스턴스화 할 수있는 추상 기본 데이터 액세스 클래스를 생성하기입니다.

2) 각 비즈니스 객체가 자신의 DataContext를 작성하고이를 데이터 액세스 클래스의 정적 메소드에 전달하도록하십시오.

방법 서명의 예는 다음

public static IEnumerable<Customer> GetCustomerForRun(DataContext db, int runID) 

내 구체적인 질문이

1) 내가 이상이 복잡 건가요 있습니다 것입니까?

2) 일반적으로 DataContext 개체를 삭제 하시겠습니까?

3) 가장 적합한 솔루션은 무엇입니까? 그들 중 어느 것도 추천하지 않는다면?

+0

저장소 및 작업 단위 패턴 확인 : http://www.google.ca/search?hl=ko&q=repository+unit+of+work+linq+to+sql&aq=f&aqi=&aql=&oq= –

답변

0

1) 제가 이것을 복잡하게합니까?

응용 프로그램이 단순히 DataContext를 사용하여 이해 대신 SQL에 LINQ 위에 추상화 계층을 성공시키는 일을 더 쉽게 만들 수있는 위치 일을 더 복잡하게 만들 수도 믹스에 패턴을 억지로 매우 작은 경우 정말 달려있다 .

2) 일반적으로 DataContext 개체를 삭제 하시겠습니까? 당신이 당신의 슬픔의 원인이됩니다 using(){} 블록 포장 필터링을 수행하는 주위 IQueryable<T> 전달 계획이라면

그것은 당신의 implamentation에 따라 달라집니다.linq to sql은 GetEnumerator()을 호출 할 때 SQL 쿼리 만 트리거하므로 컨텍스트가 삭제되어 호출이 실패합니다. 이 예 Conceder

:

IQueryable<Table> GetStuff() 
{ 
    using(var db = new DataContext()) 
    { 
    return db.Tables.Where(i=>i.Id == 1); 
    } 
} 

다른 방법이 GetStuff().Where(i=> i.Name == "Jon").ToList() 컨텍스트가 이미 삭제 된 경우로 쿼리가 실패합니다 수행하려고 할 경우

.

지금 당신은 당신이 일을하고 당신이 당신의 쿼리를 필터링하고 매우 마지막 순간까지 SQL 문 실행을 연기 할 수 IQueryable

IQueryable<Table> GetStuff() 
{ 
    return db.Tables.Where(i=>i.Id == 1); 
} 

GetStuff().Where(i=> i.Name == "Jon").ToList()의 힘을 얻을 수 있다는 것을하지 않으면. 자세한 내용은 here을 참조하십시오.

3) 내 솔루션 중 가장 적합한 것은 무엇입니까? 그들 중 어느 것도 추천하지 않는다면?

보통 단위 테스트를 매우 어렵게 만들기 때문에 정적 클래스/메소드를 사용하지 않습니다. 아마도 좋은 정보는 Repository pattern과이 answer을 보면 알 수 있습니다.이 정보는 빠른 정보를 제공합니다.

관련 문제