根据字符串参数注入类型

时间:2015-01-12 18:55:25

标签: c# wpf simple-injector

我想基于参数创建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 个答案:

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