2012-10-10 2 views
1

LINQ to SQL 클래스 (DataContext)을 사용하여 DB에 연결합니다. 동일한 스키마를 가진 데이터베이스가 세 개 있는데, Development, StagingLive입니다. 나는 그들이 동일한 스키마를 가지고 있다면 DataContext 생성자에 전달하는 연결 문자열 만 변경함으로써 동일한 DataContext를 사용하여 연결할 수 있다는 것을 깨달았습니다. LINQ to SQL DataContext 생성자 숨기기

public interface IDataContextCreator 
    { 
     MyDataContext CreateDataContext(); 
    } 

지금 나는 Development, Staging 또는 Live DB를 연결하려면이 인터페이스의 concerete 구현을 가질 수 있습니다 DataContext를 생성에 대한 모든 호출이 통과하도록 나는 인터페이스를 선언했다.

는 지금처럼에 은 위의 인터페이스를 통해 이동 의 DataContext의 창조에 대한 모든 호출을 강제로 내 DataContext의 생성자을 숨길 것이다. DataContext의 액세스 가능성을 internal으로 변경하면 솔루션의 다른 프로젝트에서 사용할 수 없습니다. 클래스 접근성 수정자를 public으로 유지하지만 생성자를 internal으로 변경하는 것이 이상적입니다. 자동 생성 클래스에서이를 수행 할 수있는 방법이 있습니까? 이 문제에 대한 다른 해결책이 있습니까?

감사합니다.

편집 : 존 생성자는 internal이어야합니다. 내 데이터 레이어에 이것들이 있고 다른 프로젝트/레이어의 클래스가이 생성자에 접근하는 것을 원하지 않습니다. 그러나 이들은 인터페이스를 사용하여 DataContext 만 만들고 생성 된 DataContext 만 사용할 수 있어야합니다. 클래스 수준에서 public이 될 것이기 때문입니다.

+1

왜 내부 *가 아닌 * 보호 *로 생성자를 변경 하시겠습니까? –

+0

가능한 복제본 http://stackoverflow.com/questions/3671331/make-sure-object-only-created-by-factory-c –

+0

@WiktorZychla - 저는 여기가 중복되어 있다고 생각하지 않습니다. ** DataContext **의 자동 생성. 이것들을 직접 편집해야한다면 ** DataContext ** 클래스를 public (즉 모든 사람이 사용할 수 있음) _으로 유지하면서 생성자를 내부적으로 유지하면됩니다. –

답변

1

생성자를 protected로 선언 할 수 있습니다.

public class MyDataContext : DataContext { 
    protected MyDataContext() { 
    } 
} 
+0

Visual Studio가 나를 위해 DataContext를 만들고 자동 생성 된 파일을 편집하고 싶지 않습니다. –

2

VS 코드 gen을 T12 템플릿으로 바꿀 수 있습니다 (http://l2st4.codeplex.com/). 이렇게하면 생성자 코드 침을 public이 아닌 protected로 수정할 수 있습니다.

그러나 구성 파일에서 연결 정보를 변경하고 특정 빌드 작업에 적절한 연결 문자열을 가져 오기 위해 변환을 사용하는 대신 별도의 데이터 컨텍스트를 사용하는 이유가 궁금합니다. http://msdn.microsoft.com/en-us/library/dd465326.aspx

+0

감사합니다 Jim. 나는 이것이 좋은 선택이라고 생각한다. 나는 가능하다면 이것들을 속성에 설정하는 것을 선호했을 것입니다. 구성 파일에서 연결 정보를 변경할 수는 있지만 즉시 수행 할 수 있다면 테스트에도 사용할 수 있습니다. –

+0

유닛 테스트 프로젝트에 다른 설정 파일을 사용하십시오. –