使用 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 有基本的了解,我知道我的问题是由这些框架管理的。

问题是,哪种解决方案最适合解决我的问题,我该怎么做?

提前感谢您的帮助。

使用 Unity 或 MEF 在 C# 中进行条件类型解析

如果使用文件扩展名来区分文件类型,则可以根据文件扩展名为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 方法返回扩展的前导".",因此您必须将其删除或使用前导"."配置映射名称。