這是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());
}
}
我認爲這是工廠模式的情況。 –