可扩展的体系结构,以基于字符串创建子类对象?

时间:2014-06-03 16:24:24

标签: c# .net design-patterns unity-container

考虑一个用户可以上传文件的表单。

我查看随文件发送的mime类型(例如application/pdf),并希望构建一个适当类型的对象。

对于PDF,这将是PdfDocument继承自抽象Document类的对象。

如何通过额外的“mime字符串到类”映射来构建此体系结构以便轻松扩展?我希望能够轻松地为新的mime类型添加类,而无需更改处理上载文档的现有代码。

天真的实现看起来像这样:

public Document GetDocumentByMimeType(string mimeType) {
    switch(mimeType)
        case "application/pdf":
             return new PdfDocument();
        case "application/msword":
             return new WordDocument();
        ...
}

每次我想添加一个带有Document子类的新mimetype时,我都必须触摸此代码。

我使用Unity作为IoC框架,我可以通过在启动时以某种方式注册类型来解决这个问题吗?有没有办法只通过将子类添加到程序集来自动注册类型?

在上述方法中从mimetype解析类的最佳方法是什么?

2 个答案:

答案 0 :(得分:2)

您是否考虑过使用System.Activator.CreateInstance()

这些方法允许您从类的类型或名称在运行时创建对象的实例。

因此,您可以维护类的字典,甚至可以使用数据库/配置文件加载集,然后可以使用它来创建所需对象的实例。

例如来自MSDN

ObjectHandle handle = Activator.CreateInstance("PersonInfo", "Person");
Person p = (Person) handle.Unwrap();
p.Name = "Samuel";
Console.WriteLine(p);

Person dll创建PersonInfo的实例。

答案 1 :(得分:1)

如果要通过特定接口或基类注册所有类型的处理程序,则可以在包含方法的类的构造函数中使用ResolveAll。

以下链接描述了ResolveAll命令

http://msdn.microsoft.com/en-us/library/ff660852(v=pandp.20).aspx

让你的处理程序提供一个键,这是类支持的mime类型,然后你可以获取从resolve all返回的IEnumerable,并根据键将其转换为字典。

最后在你的方法中,只需针对字典对mime类型执行TryGetValue,并使用合理的错误消息处理缺少的mime类型。