c# - MEF ImportMany 类型参数 : elegant solution?

标签 c# .net metadata mef

我对 MEF 完全陌生,想在我当前开发的项目中使用它。

想法:我想写一个FileLoader<T>这需要 T作为我尝试加载的类型的参数,并为我提供有关支持加载到此类型的文件扩展名的数据。类型加载器在解决方案中分散的类中提供,如 Func<string, T>并应由 MEF 收集到 IEnumerable 。然后从元数据中收集支持的文件类型。

这就是我尝试做的事情:

[Export(typeof(IFileLoader<>))]
class FileLoader<TData> : IFileLoader<TData>
{
    static FileLoader()
    {
        SimpleIoc.Default.Register(() => { return new FileLoader<Model.CompositeSignal<Model.SignalBase>>(); });
    }

    [ImportMany(typeof(Func<string, TData>))] // Problem here!!!
    private IEnumerable<Func<string, TData>> Loaders { get; set; }

    public FileLoader()
    {
        //TODO: Compose here
    }

    public IEnumerable<FileExtensionFilter> GetSupportedFiletypes()
    {
        throw new NotImplementedException();
    }

    public TData LoadFromFile(string filename)
    {
        throw new NotImplementedException();
    }
}

//////////////// Somewhere else in a class //////////////////////////////////////

    [Export(typeof(Func<string, CompositeSignal<SignalBase>>))]
    [SupportedFileType(FileTypeDescription="Signal interpolation file", FileTypeMask="*.interpol.xml")]
    public CompositeSignal<InterpolatedSignal> InterpolationFileLoader(string filename)
    {
        throw new NotImplementedException(); //TODO
    }

////////////////////////////////////////////////////////////////////////////////

[MetadataAttribute]
[AttributeUsage(AttributeTargets.Method, AllowMultiple=true)]
public class SupportedFileTypeAttribute : Attribute
{
    public string FileTypeDescription { get; set; }
    public string FileTypeMask { get; set; }

    public SupportedFileTypeAttribute() 
        : base() 
    { } 
}

问题是我不能在 ImportMany 属性的 typeof 中使用通用参数。现在,我当然可以尝试导入所有类型加载器并循环它们,但我无法想象这是一个优雅的解决方案。

最好的方法是什么?

提前致谢。

最佳答案

我不认为循环遍历 Loaders属性(property)真是一件坏事。您只需要执行一次(或者每次重组发生时,如果您设置 AllowRecomposition = True )。

我会让元数据指定它加载的数据类型,并根据它提取所需的加载器。这基本上就是元数据的用途。如果您使用Lazy<T, TMetadata> ,您不使用的类型甚至不会被创建。

关于c# - MEF ImportMany 类型参数 : elegant solution?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12370509/

相关文章:

c# - 将委托(delegate)作为类型参数传递并使用它会引发错误 CS0314

python - 从 10-K -- 提取 SIC、CIK,创建元数据表

ios - 使用AVAUDIOPLAYER从音频流中获取元数据

c# - 如何在 PCL(可移植类库)中列出所有加载的程序集

c# - 从 C# 客户端在 Solr 中索引 pdf 文档

c# - 为什么 FxCop 将 GC.KeepAlive() 标记为违规?

metadata - OpenText 内容服务器搜索 API : Retrieve a file's category data via URL link in XMLformat?

c# - 请求和存储用户输入 C#

c# - 如何在 webbrowser 控件中获取链接样式表的地址

c# - 在 C# 中使用 MySql.data