1

내가 인터페이스가 있습니다사용할 인터페이스 구현을 전역으로 설정할 수 있습니까?

public interface IHHSDBUtils 
{ 
    void SetupDB(); 

    bool TableExists(string tableName); 
    . . . 

을 ... 그 여러 구현이 있습니다

public class SQLiteHHSDBUtils : IHHSDBUtils 
public class SQCEHHSDBUtils : IHHSDBUtils 
public class FlatfileHHSDBUtils : IHHSDBUtils 
public class TestHHSDBUtils : IHHSDBUtils 

I는, 세계적으로 접근 지점에서 사용하려고하는 구현 지정할 수 있도록하려면 로 : 다음

public static class HHSConsts 
{ 
    public static IHHSDBUtils hhsdbutil = SQLiteHHSDBUtils; 

... 그래서 앱 어디에서든처럼 전화 :

private HHSDBUtils hhsdbutils { get; set; } 
. . . 
hhsdbutils = new HHSConsts.hhsdbutil; 
hhsdbutils.SetupDB(); 

이것이 가능합니까? "SQLiteHHSDBUtils '는'형식 '이지만 위의 hhsdbutil에 대한 할당과 함께'변수 '처럼 사용됩니다.

+3

당신이 의존성 주입을 사용한 경우 (당신이하지 왜?) 당신이 말할 수있는 디 컨테이너입니다. 현재 쓰여지고있는 방식으로 그냥 새로 만들 수 있습니다 public static IHHSDBUtils hhsdbutil = new SQLiteHHSDBUtils(); – reggaeguitar

+0

예를 들어 설정 파일을 기반으로 정확한 인스턴스를 해결하는 서비스 로케이터를 사용할 수 있습니다 (단,이 또한 안티 패턴으로 보여짐). 그렇지 않으면 IoC 컨테이너를 조사하여 해결할 인스턴스를 구성 할 수 있습니다. – Styxxy

+0

@reggaeguitar : DI는 내게 마치 일종의 괴물 같다. 사다리꼴 못을 둥근 구경 안으로 밀어 넣는 것을 생각 나게합니다. 이해하기 어렵고 유지하기가 쉽습니다. 제대로 작동하려면 타사 "컨테이너"가 필요합니다. 저에게 그것은 Cyrano de Bergerac의 코를 Frankenstein 박사의 괴물에 붙이는 것과 같이 약간 부자연 스럽습니다. IOW : 저는 DI를 피하려고합니다. –

답변

2

각 유형에 대해 열거 형을 생성하고 고정 된 팩토리를 사용하여 poormans 팩토리 구현을 수행 할 수 있습니다. .. 당신을 위해 유형을 생성 방법은 내가

public enum HHSDBUtilsTypes 
{ 
    Sqllite, 
    SQCE, 
    Flatfile, 
    Test 
} 

public static class HHSConsts 
{ 
    private const string implementation = HHSDBUtilsTypes.Sqllite; // you might read this from the config file 

    public static IHHSDBUtils GetUtils() 
    { 
     IHHSDBUtils impl; 
     switch(implementation) 
     { 
      case HHSDBUtilsTypes.Sqllite: 
       impl = new SQLiteHHSDBUtils(); 
      break; 
      case HHSDBUtilsTypes.SQCE: 
       impl = new SQCEHHSDBUtils(); 
      break; 
      case HHSDBUtilsTypes.Sqllite: 
       impl = new FlatfileHHSDBUtils(); 
      break; 
      default: 
       impl = new TestHHSDBUtils(); 
      break; 
     } 
     return impl; 
    } 
} 

가능한 한 현재의 코드 조각에 가깝게 유지 그리고 당신과 같이 사용합니다 :

private IHHSDBUtils hhsdbutils { get; set; } 
//. . . 
hhsdbutils = HHSConsts.GetUtils(); 
hhsdbutils.SetupDB(); 

타 옵션은 Activator.CreateInstance을 사용하는 것입니다.

const string fulltypename = "Your.Namespace.SQLiteHHSDBUtils"; // or read from config; 
hhsdbutils = (HHSDBUtils) Activator.CreateInstance(null, fulltypename).Unwrap(); 

성능을 테스트하고 측정해야합니다. 특히 이러한 방법 중 하나를 통해 많은 유형을 자주 인스턴스화해야하는 경우 성능을 측정해야합니다.

는 모든하지만주의 :

더 많은 제어를 원하는 경우 같은 제어 프레임 워크의 의존성 주입/반전을 사용 이러한 프레임 워크 중 강력한 기능뿐만 아니라 복잡성이 추가되었습니다. 프레임 워크를 선택해야한다고 생각한다면 관리 성 및 학습 가능성을 주요 요구 사항으로 삼으십시오.

여기에 구현이 구성 루트에 사용하는 몇 가지 추가 documentation on DI

+0

나는 Castle Windsor를 사용했고 그걸 어색하고 어렵게 만든다. 잠시 동안 코드를 보지 않으면 다른 사람이 그것을 유지하거나 심지어 나 자신을 유지해야하는 상황이 어떻게 될 것인가 : 악몽! –

+0

좋아, 나는 그것을 사용하지 않았지만 경고로 추가하자. – rene

+0

Castle Windsor를 사용하여 2 줄로 전체 응용 프로그램을 구성 할 수있다. 따라서 var container = new WindsorContainer(); 인터페이스 이름과 클래스의 이름을 지정하면 (예 : 'I'를 빼고), 인터페이스 이름과 클래스의 이름이 같을 때 (예 :)이 작동합니다. DI가 실제로 그렇게 어렵지는 않습니다. – reggaeguitar

관련 문제