1

좋아,이게 나를 미치게 만든다! 제네릭 클래스에 제네릭 메서드가 있습니다.Unity를 사용하여 일반 메서드에 참조 유형 전달

public interface IHandler<T> where T : class 
{ 
    T[] parseCSV(string InputFileName) 
} 

public class Handler<T> : IHandler<T> where T : class 
{ 
    public T[] parseCSV(string InputFileName) 
    { 
     if (File.Exists(InputFileName)) 
     { 
      _inputFileName = InputFileName; 
      var Engine = new FileHelperEngine<T>(); 
      return Engine.ReadFile(_inputFileName); 
     } 
     else 
     { 
      throw new IOException($"{InputFileName} not found!"); 
     } 
    } 
} 

나는 같은 IoC 컨테이너에서 일반을 ​​등록 :

container.RegisterType(typeof(IHandler<>), typeof(Handler<>)); 

여러 매퍼와 함께이

container.RegisterType<IMapper1, Mapper1>(); 
container.RegisterType<IMapper2, Mapper2>(); 
container.RegisterType<IMapper3, Mapper3>(); 

내 컨테이너가에 대한 합법적 인 FileHelpers 패키지 파일을 구문 분석 내 애플 리케이션의 대부분, 그리고 IHandler 개체 instent 수 있습니다.

IHandler<IMapper1> Handler1 = container.Resolve<IHandler<IMapper1>>(); 

그러나, 나는 그것이 FileHelperEngine에 해결할 수 있도록 일반 parseCSV 방법에 IMapper1 객체를 전달하는 방법을 알아낼 수 없습니다.

Unity를 사용하여 Mapper 객체를 FileHelperEngine에 전달하는 방법을 아는 사람이 있습니까? 그 의존성을 클라이언트 코드에서 없애고 싶습니다.

+1

그리고'IMapper1'을'Handler '의 생성자로 전달할 수 없습니까? – DavidG

답변

1

귀하는 parseCSV 방법에 의존합니다. 그러므로, 당신도 수업에 그것을 주입해야합니다. 이를 수행하는 데는 여러 가지 방법이 있지만 선호합니다. 다른 많은 개발자도 생성자 주입을 선호합니다.

따라서 당신이 필요로하는 모든 인터페이스이며, 다음과 같은 생성자로 인터페이스를 구현하는 클래스의 인스턴스 주입 : 당신이 때 지금 당신이 IFileHelperEngine을 조롱 할 수 있기 때문에 실제로 좋은

public interface IFileHelperEngine<T> where T : class 
{ 
    T[] ReadFile(string inputFileName); 
} 

public class Handler<T> : IHandler<T> where T : class 
{ 
    private IFileHelperEngine<T> fileHelperEngine; 
    public Handler(IFileHelperEngine<T> fileHelperEngine) //<----See this. 
    { 
     this.fileHelperEngine = fileHelperEngine; 
    } 
    public T[] parseCSV(string InputFileName) 
    { 
     if (File.Exists(InputFileName)) 
     { 
      _inputFileName = InputFileName; 
      return this.fileHelperEngine.ReadFile(_inputFileName); //<--and this 
     } 

     throw new IOException($"{InputFileName} not found!"); 
    } 
} 

을 단위 테스트는 Handler<T>입니다.

참고로, .NET 명명 규칙을 사용하고 있지 않습니다. 지역 주민은 낙타의 경우 표기법과 메소드 이름은 파스칼 표기을 사용해야합니다.

+0

우수! 신속한 응답에 감사드립니다! 오늘 밤 내가 잘게 될 것 같아. – Jason