我想基于参数创建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
等。
答案 0 :(得分:2)
这是案例陈述,数据库表,工厂模式和IoC之间的灰色区域。正确的解决方案完全基于您处理的不同文件。这是一个小框架,可以“像”一个Ioc容器为你的pruposes,并允许你定义扩展名=>查看器映射到应用程序中的单个位置。
为您的查看者提供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);
}
}
更新了为每次调用设置新实例的映射类:
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());
}
}
答案 1 :(得分: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);