我有一个用于实现“输出格式化程序”的界面,看起来有点像这样:
public interface IFormatOutput {}
public class HtmlOutputFormatter : IFormatOutput {}
public class TextOutputFormatter : IFormatOutput {}
// etc, etc...
public enum OutputFormat {
Html,
Text,
HappyMeal,
Excel
}
public class SomeFormattableEntity {
int Id { get; set; }
OutputFormat OutputType { get; set; }
}
因此SomeFormattableEntity
通过Dapper保存在数据库中,其OutputType
属性存储为基础整数值(即INT
列)。您可以猜测,我想提供一个IFormatOutput
的实例来根据SomeFormattableEntity
属性处理OutputType
。
是否有一些干净的最佳实践方式来处理这种关系?到目前为止,我的想法包括一个内部可能包含以下内容的工厂:
我意识到要求一个类型基于值的事物的实例是不可取的,但是当涉及到SQL时似乎很难避免这种情况。基本上问题是所有具有不同.NET类型的多个“事物”都存储在一个表中。我一直在遇到这个成语,我无法找到一个优雅的解决方案。
答案 0 :(得分:0)
怎么样:
OutputFormat format = OutputFormat.Excel;
object obj = Activator.CreateInstance("myAssemblyName", format.ToString());
假设您的枚举元素具有您的类型的确切名称?
答案 1 :(得分:0)
我可能会使用FormatsOutputFor属性来获取自定义属性。然后用属性装饰IFormatOutput
的所有实现。 e.g。
[YourAttribute(OutputFormat.Html)]
public class HtmlOutputFormatter : IFormatOutput {}
然后在你的工厂:
// get all your formatters
var formatters = AppDomain.CurrentDomain.GetAssemblies()
.SelectMany(s => s.GetTypes())
.Where(p => Attribute.IsDefined(p, typeof(YourAttribute)));
// Now go through each formatter and use the attribute to figure out which
// output format it's for. Add these to some static IDictionary<OutputFormat, Type>
您可能希望构建一些将OutputFormat
值映射到Type
的内部缓存。然后你的工厂可以仔细检查你是否只有一种类型映射到每种输出格式,如果你试图获得一个没有相应类的枚举值的格式化器,那么你不会从激活器得到一些模糊的TypeLoadException。
希望这有意义......