使用 Unity 或 MEF 在 C# 中进行条件类型解析
本文关键字:条件 类型 Unity MEF 使用 | 更新日期: 2023-09-27 17:57:12
我正在研究应用程序架构,我面临着一个大问题。该应用程序非常简单,它接收一个文件,该应用程序应用语法验证,解析,...和其他东西。我们可以有不同类型的文件(例如:File1.xx,File2.yy),每种文件类型都有语法验证和解析的特定实现。主要约束是拥有一个通用且易于扩展的应用程序(可以扩展托管文件的类型)。
这就是为什么我想象了这样的东西:
一个接口"IFileProcessor",其中我有 2 个方法(或更多)-bool IsSytaxValid(File f)-字符串解析(...)
在应用程序中,我应该有类似的东西:
**// For a current File F1
IFileProcessor fileProcessor;
if (fileProcessor.IsSyntaxtValid(){
fileProcessor.Parse();
}else
{
bla bla bla
}**
我想有一个来自File1.xx的插件(2 dll,其中我实现了IFileProcessor接口)。根据当前文件类型动态加载处理实现。
我对 Unity 和 MEF 有基本的了解,我知道我的问题是由这些框架管理的。
问题是,哪种解决方案最适合解决我的问题,我该怎么做?
提前感谢您的帮助。
如果使用文件扩展名来区分文件类型,则可以根据文件扩展名为IFileProcessor
创建命名注册。解析 IFileProcessor
时,您可以使用要解析的文件的扩展名,并通过该扩展名获取正确的实例。
可以通过编程方式创建如下所示的命名注册:
IUnityContainer container = new UnityContainer();
container.RegisterType<IFileProcessor, TxtFileProcessor>(".txt");
container.RegisterType<IFileProcessor, CsvFileProcessor>(".csv");
当您要使用插件模型时,您还可以通过相应地配置 Unity 容器来创建注册,例如:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Microsoft.Practices.Unity.Configuration" />
</configSections>
<unity>
<containers>
<container>
<types>
<type name=".txt"
type="MyNamespace.IFileProcessor, MyAssembly"
mapTo="MyPluginNamespace.TxtFileProcessor, MyPluginAssembly"/>
</types>
</container>
</containers>
</unity>
并像这样解决它:
var fileExt = System.IO.Path.GetExtension(filePath);
var fileProc = container.Resolve<IFileProcessor>(fileExt.ToLower());
请注意,GetExtension 方法返回扩展的前导".",因此您必须将其删除或使用前导"."配置映射名称。