2013-07-02 3 views
4

일부 정적 목록이있는 클래스가 있습니다. 설명의 목적을 위해 다음 두 가지만 보여 드리겠습니다.정적 메서드에 데이터베이스 컨텍스트 전달

public class Foo 
{ 
    public static readonly List<long> FirstList(EfEntities dbContext) 
    { 
     return dbContext.SomeTable.Where(x => x == 1).ToList(); 
    } 

    public static readonly List<long> SecondList(EfEntities dbContext) 
    { 
     return dbContext.SomeTable.Where(x => x == 2).ToList(); 
    } 
} 

저는 모든 정적 방법에 데이터베이스 컨텍스트를 전달하는 큰 팬이 아닙니다. 다른 접근법에 대한 제안이 있습니까?

+1

처음에 마음에 들지 않는 것을 설명하고, 사용하고있는 컨텍스트를 설명하면 도움이됩니다. 예를 들어, 인스턴스 메서드로 이러한 클래스가있는 다른 클래스에서 컨텍스트를 래핑하지 않는 이유는 무엇입니까? –

+0

@ JonSkeet 첫 번째 테스트에서 정적 인 하드 코딩 목록이있었습니다. 그러나 코드를보다 데이터 중심으로 만들고 싶습니다. 그래서 먼저 코드를 하드 코딩 한 실제 테이블 키로 변경하고 싶습니다. 당신의 제안 된 접근 방식이 갈 길입니다. – Johan

답변

1

고정시키지 마십시오. 이러한 목록을 반환하려면 컨텍스트가 필요합니다. 정적 멤버는 컨텍스트가 적게 설계되었습니다. 따라서 기본적으로 이러한 메소드를 클래스 인스턴스로 이동하고 종속성 삽입이나 다른 종류의 팩토리를 통해 생성시 컨텍스트를 제공해야합니다.

정적에 충실하기위한 디자인 결정은 무엇입니까? 끔찍한 해결 방법은 정적 필드에 컨텍스트를 한 번 전달한 다음 사용하는 것입니다.하지만 기본적으로 클래스 인스턴스로 수행해야 할 작업입니다.

+0

팁 주셔서 감사합니다. 하드 코딩 된 목록이있을 때 나는 그것들을 정적으로 만들었습니다. 나는 이것이 유형을 바꾸기에 좋은시기라고 생각한다. – Johan

4

정적 메서드 사용이 아키텍처에 의해 정당화하지만,이 extension methods로 정적 메소드를 만들 수 있습니다)이 질문의 범위를 벗어난 것 같다 :이처럼 그들을 호출 할 수 있습니다

public static class EfEntitiesExtensions 
{ 
    public static readonly List<long> FirstList(this EfEntities dbContext) 
    { 
     return dbContext.SomeTable.Where(x => x == 1).ToList(); 
    } 

    public static readonly List<long> SecondList(this EfEntities dbContext) 
    { 
     return dbContext.SomeTable.Where(x => x == 2).ToList(); 
    } 
} 

을 그 후 :

... 
EfEntities dbContext = new EfEntities(); 
List<long> firstList = dbContext.FirstList(); 
2

저는 개인적으로 dbContext 객체를 매개 변수로 전달할 생각을별로 좋아하지 않습니다. 데이터 레이어를 완전히 분리하고 다른 클래스에 저장할 수 있습니다.

public class DataAccess { 
    private EFEntities _dbContext { get; set; } 

    public EfEntities GetDbContext() { 
     if (_dbContext != null) { 
      return _dbContext; 
     } else { 
      _dbContext = new EFEntities(.....); 
      return _dbContext; 
     } 
    } 
} 

그런 다음 당신은 당신이 매개 변수로 각 시간을 전달하기보다는 필요로하는 컨텍스트를 포함하는 DataAccess 클래스를 참조 할 수 있습니다.