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

时间:2014-04-08 08:48:43

标签: c# generics dynamic unity-container mef

我正在开发应用程序架构,我正面临一个大问题。 该应用程序非常简单,它接收文件,应用程序应用语法验证,解析,...和其他东西。 我们可以有不同类型的文件(例如:File1.xx,File2.yy),每个文件类型都有一个语法验证和解析的specefic实现。 主要的限制是拥有一个通用且易于扩展的应用程序(可以扩展托管文件的类型)。

这就是我想象的原因:

接口" IFileProcessor" ,其中我有2种方法(或更多) -bool IsSytaxValid(文件f) -String Parse(...)

在应用程序中,我应该有:

**// For a current File F1
IFileProcessor fileProcessor;
if (fileProcessor.IsSyntaxtValid(){
fileProcessor.Parse();
}else
 {
  bla bla bla
 }**

我想从File2.yy(我在其中实现IFileProcessor接口的2 dll)中为File1.xx添加另一个插件。 根据当前文件类型,处理实现是动态加载的。

我对Unity和MEF有基本的了解,我知道我的问题是由这些框架管理的。

问题是,哪种解决方案最能解决我的问题,以及我该如何做到这一点?

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

如果使用文件扩展名来识别文件类型,则可以根据文件扩展名为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方法会返回前导“。”扩展名,所以您必须删除它或使用前导“。”配置您的映射名称。