【问题标题】:Conditional type resolving in C# with Unity or MEF使用 Unity 或 MEF 在 C# 中解析条件类型
【发布时间】:2014-04-08 08:48:42
【问题描述】:

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

这就是为什么我想像这样的事情:

一个接口 "IFileProcessor" 我有 2 个方法(或更多) -bool IsSytaxValid(文件 f) -字符串解析(...)

在应用程序中我应该有类似的东西:

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

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

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

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

提前感谢您的帮助。

【问题讨论】:

    标签: c# generics dynamic unity-container mef


    【解决方案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 方法返回前导“。”扩展名,因此您必须删除它或使用前导“。”配置映射名称。

    【讨论】:

    • 非常感谢,这正是我所期望的。 Xml 配置非常适合我的用例。谢谢马库斯
    • @Moon:很高兴听到它很有用。如果有帮助,请考虑接受答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多