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<>)); 

隨着幾個映射器解析文件與FileHelpers包

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

我的容器是合法的我大部分的應用程序,我可以安裝IHandler對象。

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

但是,我想不出如何將IMapper1對象傳遞到通用parseCSV方法,因此將在FileHelperEngine解決。

有誰知道如何使用Unity將Mapper對象傳遞給FileHelperEngine?我想從客戶端代碼中獲得該依賴關係。

+1

而且你不能只傳入一個'IMapper1'到'Handler '的構造函數中? – DavidG

回答

1

您對parseCSV方法有依賴性。因此,你也應該注入你的課堂。有很多方法可以做到這一點,但我更喜歡,而且我也看到許多其他開發人員也更喜歡構造函數注入。

因此,所有你需要的是一個接口,然後注入其實現接口轉換成你的構造這樣一個類的實例:

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!"); 
    } 
} 

這其實是好事,因爲現在你可以嘲笑IFileHelperEngine當你單元測試Handler<T>類。

僅供參考,您不使用.NET命名約定;當地人應使用駱駝案表示法和方法名應使用帕斯卡表示法

+0

非常好!感謝您的及時響應!看起來我今晚睡着了。 – Jason

相關問題