2

私は 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 にジェネリック パラメータを指定できないことです。もちろん、すべての型ローダーをインポートしてループすることもできますが、それが洗練された解決策であるとは思えません。

それを行うための最良の方法は何ですか?

前もって感謝します。

4

1 に答える 1

2

Loadersプロパティをループすることはそれほど悪いことではないと思います。一度だけ実行する必要があります (または を設定した場合は、再構成が発生するたびにAllowRecomposition = True)。

ロードするデータのタイプをメタデータで指定し、それに従って必要なローダーを抽出します。それが基本的にメタデータの目的です。を使用するLazy<T, TMetadata>と、使用しない型は作成されません。

于 2012-09-11T19:34:59.717 に答える