2015-01-12 47 views
0

我想基於參數獲得IoC創建類型。我還需要指導如何存儲此參數信息。基於字符串參數的注入類型

我需要基於字符串文件類型,更具體,基於擴展名進行類。

我對數據進行簡單的文件信息類:

class info 
{ 
    public string FileName { get; set; } 
} 

,我需要則會根據該「FileName」擴展,這樣我可以呈現查看器類。

我在WPF中使用DataTemplates並將類型分配給視圖效果很好。我只需要根據FileName分配類型。

現在,我只是使用擴展字符串new[]{".pdf",".html",".jpg"};的靜態數組來確定要返回哪種類型。這完全不可持續。

我想有一個數據源,看上去像這樣的:

Extension  Type 
============= ============= 
.pdf   Webviewer 
.html   Webviewer 
.doc   Docviewer 
.docx   Docviewer 
.txt   Textviewer 

等。

+2

我認爲這是工廠模式的情況。 –

回答

2

這是case語句,數據庫表,工廠模式和IoC之間的灰色區域。正確的解決方案純粹是基於你如何處理不同的文件。這裏有一個小框架可以像你的Ioc容器一樣爲你制定標準,並允許你在你的應用程序的單個位置定義extension => viewer mapping。

給你的瀏覽器是一個commin接口或基類:

public interface IViewer { 
    void LaunchViewer(string fileName); 
} 

讓您的映射類:

public class FileExtensionMap { 
    private Dictionary<string, IViewer> maps; 
    public IViewer this[string key] { 
     get { 
      if (!this.maps.ContainsKey(key)) { 
       throw new KeyNotFoundException(); 
      } 

      return this.maps[key]; 
     } 
    } 

    public FileExtensionMap() { 
     this.maps = new Dictionary<string, IViewer>(); 
     this.LoadMaps(); 
    } 

    public void LoadMaps() { 
     this.maps.Add("PDF", new PdfViewer()); 
     this.maps.Add("DOC", new WordViewer()); 
    } 
} 

定義您的FileExtensionMap的實例作爲一個單身或靜態類,無論你喜歡。

一個簡短的例子。你要麼引用您的靜態,你的單,或映射爲依賴傳遞到您的調用類:

public class Example { 
    FileExtensionMap map; 

    public Example(FileExtensionMap map) { 
     this.map = map; 
    } 

    public void View(FileInfo file) { 
     map[file.Extension].LaunchViewer(file.Name); 
    } 
} 

更新映射類將instaniate一個新實例每次調用:

public class FileExtensionMap { 
    private Dictionary<string, Func<IViewer>> maps; 
    public IViewer this[string key] { 
     get { 
      if (!this.maps.ContainsKey(key)) { 
       throw new KeyNotFoundException(); 
      } 

      return this.maps[key].Invoke(); 
     } 
    } 

    public FileExtensionMap() { 
     this.maps = new Dictionary<string, Func<IViewer>>(); 
     this.LoadMaps(); 
    } 

    public void LoadMaps() { 
     this.maps.Add("PDF",() => new PdfViewer()); 
     this.maps.Add("DOC",() => new WordViewer()); 
    } 
} 
+0

您可以爲每個查看器設計一次實例調用。通常我們需要每個文件的查看器實例。 –

+0

已更新答案以創建查看器的新實例 –

0

的Unity IoC允許註冊名稱類型。該名稱可以是文件擴展名。我假設所有觀衆實現了IViewer接口。

// Register the viewer types 
var viewers = new UnityContainer(); 
viewers 
    .RegisterType<IViewer, Webwiewer>(".jpeg") 
    .RegisterType<IViewer, Docviewer>(".doc"); 

// Get a viewer 
var viewer = viewers.Resolve<IViewer>(ext); 
相關問題