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