2016-07-07 4 views
0

C#에서 데이터베이스에 쿼리를 수행하려고 할 때 DBQuerier()이라는 새 인스턴스를 만들고 Run() 메서드를 호출합니다.참조없이 데이터 지속

DBQuerier은 실행 방법에 전달되는 항목에 따라 여러 데이터베이스 중 하나에 연결할 수 있습니다 (예 : new DBQuerier().Run(DBEnum.CatDatabase)).

DBQuerier은 다양한 솔루션으로 라이브러리의 일부입니다.

모든 연결을 메모리에로드하고 열거 형 조회에 사용하도록로드하고 구문 분석 할 수있는 구성 파일이 있습니다. 그러나 나는이 정보를 유지하는 방법을 확신하지 못한다. 그것은 의존성 주입을위한 작업과 같습니다

new DBQuerier(new MyConnectionStringLoader()).Run(...)

그러나 나는 그것이 파일을로드하고 DB를 쿼리가이 방법으로 실행되는 매 시간 구문 분석하고 싶지 않아요. 이 개체는 매번 생성되고 폐기되므로 DBQuerier 내에 저장할 수 없습니다.

정적 인 경우 ConnectionStringManager 클래스를 만들면 종속성에 MyConnectionStringLoader를 삽입 할 수 없으며 단위 테스트를 어렵게 만듭니다. 만약 내가 그것을 싱글 톤으로 만들면 비슷한 문제가 생길 것이다.

이 문제에 대한 좋은 해결책이 있습니까? 그것이 정적 인 수업이나 싱글 톤을 사용하지 않는다고 말하는 무수한 게시물이 나왔다. 그래서 나는 꽤 붙어있다.

+0

결코 절대로 말하지 마십시오! 나는 싱글 톤 (singleton)과 스태틱 (static)은 그런 경우에는 괜찮다고 말한다. 그렇다면 왜 ConnectionString과 같은 추가 정보가 들어있는 DBQuerier에 대한 클래스를 만들지 않습니까? – Mono

답변

0

상황에 따라 (DI를 지원하는) 싱글 톤이 유효한 경로입니다.

+0

이것에 대한 인터넷 검색 패턴은 싱글 톤과 DI 나쁜 것을 말하는 많은 사이트를 보여줍니다 ...하지만 당신이 옳다고 생각하고 그들을 무시해야합니다! – NibblyPig

+1

@SLC 의견은 인체의 특정 지역 * 어느 지역도 마찬가지입니다 ... 모두에게 하나가 있습니다. 인터페이스가 의미가있는 한 잘 문서화되어 있으며 시스템의 나머지 부분과 유사한 운영 휴리스틱 패턴을 가지고 있으므로 사용해야합니다. – OmegaMan

2

DbQuerier은 모든 데이터베이스에서 정확히 동일합니다. 변경되는 유일한 것은 연결 문자열입니다.

I는 다음과 같이 할 것 :

public interface IDbQuerier 
{ 
    void Run(); 
} 

public abstract class BaseDbQuerier : IDbQuerier 
{ 
    private static IDictionary<DbEnum, string> _connections; 

    static BaseDbQuerier() 
    { 
     _connections = // Load connection strings from configuration 
    } 

    protected abstract DbEnum Database { get; } 

    public void Run() 
    { 
     string connectionString = _connections[Database]; 
     // DbQuerier logic 
    } 
} 

public enum DbEnum 
{ 
    CatDatabase, 
    DogDatabase, 
    TurtleDatabase 
} 

그리고 다른 구현 :

public class CatDbQuerier : BaseDbQuerier 
{ 
    protected override DbEnum Database { get { return DbEnum.CatDatabase; } } 
} 

public class DogDbQuerier : BaseDbQuerier 
{ 
    protected override DbEnum Database { get { return DbEnum.DogDatabase; } } 
} 

public class TurtleDbQuerier : BaseDbQuerier 
{ 
    protected override DbEnum Database { get { return DbEnum.TurtleDatabase; } } 
} 

당신이 쉽게 그것을 필요로하는 모든 클래스에 주입 할 수 있도록 각 데이터베이스에 대한 다른 구현을 갖는 원하는 DI 프레임 워크를 사용하십시오.

+0

좋아 보이는데, 나는이 접근법을 시도 할 것입니다. 많은 감사합니다. – NibblyPig