2

이것은 큰 문제가 아니며 응용 프로그램이 크지 않을 것이라고 확신하지만 경험할 수있는 곳에서는 DI를 연습하려고합니다. 나는 다음과 같은 클래스를 가지고 있으며, 콘솔 어플리케이션에서 사용자가 입력 한 몇몇 인수를 구문 분석하고 전달 된 인수를 기반으로 ICommand의 인스턴스를 리턴한다. 콘솔 어플리케이션의 명령어를 사용하는 디자인은 Mark Seeman의 책 Dependency Injection에서 가져온다. .그물. 내 문제는 ICommand 클래스의 한 구현은 IDocumentService의 인스턴스가 필요하다는 것입니다. 지금은 ICommand 의존성을 만족시킬 수 있는지 확인하기 위해 IDocumentService를 생성자 삽입을 사용하여 파서에 전달합니다. 클래스에 종속성이있는 경우 의존성을 사용해야하며 종속성에 전달하지 않아야한다고 생각하기 때문에 이것은 이상한 것 같습니다. 동시에 파서 클래스가 문서 루트보다 나중에 IDocumentService를 해석 할 수 있도록 추상 IDocumentServiceFactory를 작성하면 너무 과하게 될 것이라고 생각합니다. 이 디자인 문제를 해결하기위한 모든 지침을 주시면 감사하겠습니다.의존성 주입 다른 콘크리트 유형에 대한 의존성 전달

public class GasTranParser 
{ 
    private readonly IArchiveService service; 
    public GasTranParser(IArchiveService service) 
    { 
     if(service == null) 
      throw new ArgumentNullException("service"); 
    } 


    ICommand Parse(IEnumerable<string> args) 
    { 
     if (args == null || args.Count() != 1) 
      return new HelpCmd(); 

     List<string> argsList = args.ToList(); 

     return new GasTranComposerCmd(service, argsList[0]); 
    } 
} 
+2

, 당신이 대신 GasTranParser에 ICommandFactory을 통과, 콘크리트 CommandFactory을 수 있도록 할 것 같아 적절한 서비스로 GasTranComposerCmd 인스턴스를 생성하십시오. –

답변

2

내가 일반적으로 종속성을 통과에 문제가 표시되지 않지만, 특정 예에서, 당신은 GasTranComposerCmd 인스턴스를 만들 CommandFactory 콘크리트를 대신 GasTranParser에 ICommandFactory을 통과하고 수 있도록 할 것 같아 적절한 서비스 : 나는 일반적으로 통과 의존성 문제를 볼 수 있지만, 특정 예에서하지 않는

public class GasTranParser 
{ 
    private readonly ICommandFactory command_factory; 

    public GasTranParser(ICommandFactory command_factory) { ... }  

    ICommand Parse(IEnumerable<string> args) 
    { 
     if (args == null || args.Count() != 1) 
      return new HelpCmd(); 

     List<string> argsList = args.ToList(); 

     return command_factory(argList[0]); 
    } 
} 
+0

+1. 공장 내에서 IoC를 서비스 탐지기로 사용할 수 있다는 힌트를 제공하십시오. – jgauffin

+0

나는 그것이 command_factory.CreateCommand (argList [0])이어야한다고 생각한다; 또는 무엇인가 비슷하게 (메소드 이름이 빠짐) – Meryovi