>source

IGameScoreSource 타입을 주입하고 싶습니다  수업에 들어가지만 어떻게해야할지 모르겠습니다.

static class GamesScoreSourceFactory
{
    public IGameScoreSource GetGameScoreSource(GameScoreSourceType gameScoreSourceType)
    {
        switch(gameScoreSourceType)
        {
            case FromFile:
                return new GameScoreFile();
            case FromDB:
                return new DatabaseRepos();
            case FromThirdPartyAPI:
                return new ThirdPartyWrapper();
        }   
    }
}

두 가지 시나리오에 대해 두 가지 질문이 있습니다.

세 가지 경우 모두 매개 변수의 출처를 마법으로 파악합니다. 그래서 GameScoreFile   DatabaseRepos 의 경우 파일 경로를 알고 있습니다.  연결 문자열을 찾을 위치를 알고 있습니다.

아마도이 위치는 구체적인 클래스로 하드 코딩되어 있습니다. 그러나 위치를 변경하려면 어떻게해야합니까? scores.txtGameScoreFile.cs 에서 하드 코딩되었다고 가정  만약 내가 rand_scores.txt 를 원한다면 어떻게 ?

그래서 :

static class GamesScoreSourceFactory
    {
        public IGameScoreSource GetGameScoreSource(GameScoreSourceType gameScoreSourceType, string param)
        {
            switch(gameScoreSourceType)
            {
                case FromFile:
                    return new GameScoreFile(string param);
                case FromDB:
                    return new DatabaseRepos(string param);
                case FromThirdPartyAPI:
                    return new ThirdPartyWrapper(ThirdPartyConfig conf{IPAddress = ipAddress, Port = port});
            }   
        }
    }

첫 번째 두 경우는 괜찮 았지만 세 번째 경우는 구성 개체를 사용하기 때문에 그렇지 않습니다.

다른 팩토리 클래스를 만들어야합니까? 그러나 호출 코드는 어떤 Factory 객체를 호출해야하는지 알 필요가 없으며 결과적으로 Factory 자체가됩니다?

이 문제를 어떻게 처리해야할지 모르겠습니다 ... 이것이 중복 된 경우 링크 해주세요.

  • 답변 # 1

    팩토리 클래스에 대한 의존성으로 아래 유형을 이상적으로 주입하는 것이 좋습니다

    GameScoreFile
    DatabaseRepos
    ThirdPartyWrapper
    
    

    따라서 의존성 해결에 사용하는 프레임 워크는 해당 유형에 대해 전달할 내용을 알고 있습니다.

  • 답변 # 2

    팩토리 클래스가 너무 많이 알 필요가 없도록 종속성을 격리하려고했습니다.

    IGameScoreSource의 구체적인 구현마다 고유 한 종속성이 있다고 가정 해 봅시다. 위의 예에서 두 개는 문자열이 필요했고 세 번째는 ThirdPartyConfig가 필요했습니다.

    이처럼 보이지는 않지만 클래스를 따라 리팩토링 할 때 의존성을 도입하거나 변경할 때마다 팩토리 클래스도 변경되어야합니다. 이상적이지 않습니다.

    구체적인 유형마다 팩토리를 만들 수 있으며 구현 중 하나를 변경하면 자체 팩토리에만 영향을 미칩니다. 그러면 기본 팩토리 클래스는 이러한 특정 팩토리에서만 작동하며 각 변경에 영향을 미치지 않습니다.

    올바른 솔루션은 도메인 모델과 사용중인 IOC 접근 방식에 따라 다릅니다.

관련 자료

  • 이전 php/html 스크립트를 통해 생성 된 버튼에 기능 추가
  • 다음 c++ - 루프 조건에서 이것이 작동하지 않는 이유는 무엇입니까?