考虑一个用户可以上传文件的表单。
我查看随文件发送的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解析类的最佳方法是什么?
答案 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类型。