2016-07-11 2 views
1

DI 용 Structuremap을 사용하여 비즈니스 및 DAL 계층에 모두 사용할 수있는 응용 프로그램이 있습니다. 이 시점까지, 나는 작업하고있는 환경마다 하나의 DAL을 가지고있었습니다. 그래서 내가 config에서 그것을 잡아 내 모든 연결에 대한 그 값을 사용합니다. 이것의 한 예가 있습니다.StructureMap을 사용하여 여러 데이터베이스 문자열을 사용하는 DAL에 대한 종속성 삽입

using (SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["Database"].ToString())) 
{ 
    //Do a call to db here. 
} 

다음과 같이 구조체 맵을 사용하여이 메서드를 호출합니다.

ObjectFactory.GetInstance<IDALManager>().MethodName(); 

지금 나는 사용자가 디바이스 환경에서 변경 후 테스트 또는 자극 환경에 상승하기 버튼을 눌러 허용 할 새로운 기능이 있습니다. 따라서 DAL 관리자의 연결 스트링을 변경할 수 있어야합니다. 또한 DAL에있는 모든 연결 문자열 액세스를 유지하고 다른 레이어에는 액세스하지 않으려합니다. 이 작업을 수행하는 방법이나이 패턴을 조사 할 디자인 패턴에 대한 조언을 찾고 있습니다.

업데이트 된 정보 사용자는 어떤 연결 문자열을 사용해야하는지 결정할 것입니다. 예를 들어, 그들은 dev에서 test로 데이터를 이동할 것이고, 소스와 목적지를 선택할 것입니다.

string source = \\user selection from combobox. 
if (source == "DEV") 
{ 
    //Instantiate dev instance of manager 
} 
if (source == "TEST") 
{ 
    //Instantiate Test Instance of manager. 
} 
+0

이 'ObjectFactory.GetInstance () .MethodName();'을 어디에서 호출합니까? 왜 DAL에 모든 연결 문자열 액세스를 유지하려고합니까? –

+0

나는 비지니스 레이어에서 그 메소드를 호출하고있다. 우려의 분리를 위해 연결 문자열을 DAL에 보관하고 싶습니다. 실제로 이것은 DI를 처음 사용하는 것으로 여러 연결 문자열을 처리하는 올바른 방법에 대한 지침이 필요합니다. – Nate

+0

사용할 연결 문자열을 어떻게 결정할 예정입니까? 그러한 결정이 어떻게 될 것인지 의사 코드를 제공 할 수 있습니까? –

답변

0

abstract factory이 필요합니다. 몇 가지 예를 들어 this question의 대답을 살펴보십시오. 특정 경우

, 초록 팩토리 인터페이스는 다음과 같아야합니다

public interface IDALManagerFactory 
{ 
    IDALManager Create(string environment); 
} 

당신은 적절한 연결 문자열과 "DAL 관리자"를 만들어이 인터페이스의 구현을 작성해야합니다.

public class MyDalManager: IDALManager 
{ 
    private readonly string connectionString; 

    public MyDalManager(string connectionString) 
    { 
     this.connectionString = connectionString; 
    } 

    public MyMethod() 
    { 
     //.. 

     using (SqlConnection con = new SqlConnection(connectionString)) 
     { 
      //Do a call to db here. 
     } 
    } 
} 

지금 공장의 구현은 다음과 같이 보일 것입니다 :

것은이 작업을 수행 할 수 있으려면, 당신은 연결 문자열을 필요로 같은 클래스의 생성자에 주입한다

public class DALManagerFactory : IDALManagerFactory 
{ 
    public IDALManager Create(string environment) 
    { 
     if(environment == "DEV") 
      return new MyDalManager(
       ConfigurationManager.ConnectionStrings["Database"].ToString()); 
     //... 
    } 
} 

이 팩토리 클래스는 Composition Root에 있어야합니다. 이 팩토리 클래스의 컨테이너에 액세스하여 "DAL 관리자"를 만들 수도 있습니다. 이제

, 적절한 "DAL 관리자"에 대한 액세스를 필요로하는 클래스는 IDALManagerFactory이 생성자에 주입해야하고, 환경의 이름을 통과하는 Create 메소드를 호출하여 IDALManager를 만드는 등의 공장을 사용합니다.

코드에서 DAL 계층의 연결 문자열에 액세스하고 있습니다. 구성 루트에서만 이러한 정보에 실제로 액세스해야합니다.