0

데이터 파일 패키지의 준비, 유효성 검사 및 정리 루틴을 조정하는 클래스가 있습니다. 나는 IoC 컨테이너 (이 경우 Ninject)를 사용할 때 올바른 패턴을 찾기 위해 고심하고있다. 제가 실행하고있는 문제는 패키지에서 제공되는 것에 따라 여러 유효성 검사 클래스 중 하나를 사용할 수 있다는 것입니다.IoC 컨테이너를 사용하여 런타임에 중첩 된 종속성 해결 패턴

public class PackageProcessor 
{ 
    private readonly ILog log; 

    public PackageProcessor(ILog log) 
    { 
     this.log = log; 
    } 

    public void Process(CustomerProfile profile, PackageType type, string path, bool validateOnly = false, bool offlineValidation = false) 
    { 
     // ... 
     // Uncompress package files (if compressed) or copy raw files to woroking folder 
     // Ensure working folder contains the required files for the package type 
     // Validate package data 
     foreach (var packageFile in packageConfiguration) 
     { 
      var timer = Stopwatch.StartNew(); 
      var recordCount = 0UL; 
      var validator = DependencyResolver.Kernel.Get<RecordValidator>(metadata => 
       metadata.Has("file") && 
       String.Equals(metadata.Get<string>("file"), packageFile.Name, StringComparison.OrdinalIgnoreCase)); 

      using (var reader = new CsvReader(new StreamReader(Path.Combine(workingFolder.FullName, packageFile.Name)), false)) 
      { 
       while (reader.ReadNextRecord()) 
       { 
        var recordResult = validator.IsValid(reader); 
        if(!recordResult.IsValid) 
        { 
         // LOG: record error messages 
         // Mark the job as failed 
        } 
        recordCount++; 
       } 
      } 

      // LOG: File appears to be valid. {0} records were found. 
      // LOG: File contains invalid records. {0} records were found, {1} were invalid. 

      timer.Stop(); 
      log.Info(m => m(Strings.RecordsProcessed, recordCount, timer.Elapsed, (recordCount/timer.Elapsed.TotalSeconds))); 
     } 
     // Clean and output the data 
    } 
} 

당신은 내가 프로세스의 일부로서 동적으로 검증 클래스를 해결해야 할 필요가 볼 수 있듯이 : 여기에 무슨 일이 일어나고 있는지의 거친 좋습니다. 과거에는 적절한 유효성 검사기를 찾고 반환하는 Factory 클래스를 만들었을 것입니다. 나는 생성자를 통해 해당 팩토리를 주입하는쪽으로 기울어 져 있지만 IoC 컨테이너 참조를 전달하지 않고 중첩 된 종속성 해결을 처리 할 때 발생할 수있는 더 나은 접근 방법이 있는지 알아보기 위해이를 배치하고자했습니다.

은 ( a duplicate question가있을 수 있습니다,하지만, 난 여전히 우리가 같은 일을 요청하는 경우를 통해 해결하려고 노력하고있어) 유효성 검사기와 프로세서가 나는 완전히 다른 접근 방식을 취할 것 재사용이 있다고 가정

+1

주입 된 추상 팩토리는 다음과 같은 방법으로 사용됩니다. http://stackoverflow.com/questions/1943576/is-there-a-pattern-for-initializing-objects-created-via-a-di-container/1945023 # 1945023 –

답변

2

. 나는 모든 RecordValidators를 생성자에 삽입하고 CanHandle (??? packageFile) 메서드를 추가하여 루프에서 일치하는 것을 선택하거나 모든 유효성 검사기를 갖는 유효성 검사기 선택기를 주입하여이 함수에서 가져옵니다.

+0

그래서 각 RecordValidator에 CanHandle (문자열 파일) 메서드를 추가하고 IEnumerable 를 허용하도록 생성자를 수정하고 Kernel.GetAll ()를 사용하여 모든 레코드를 삽입해야합니다. –

+0

네, GetAll을 수동으로 주입하면 안됩니다. Ninject에 남겨두면 PackageProcessor의 인스턴스를 생성 할 때 모든 RecordValidator가 자동으로 주입됩니다. –

관련 문제