基于元数据的mef导出
mef export based on metadata
我正在尝试根据元数据导出模块。
compositioncontainer
目录中包含两个部分
[1] = {Modules.ProjectModule}
[0] = {Modules.DocumentsModule}
但是 GetExportedValues
returns 什么都没有。
[ImportMany(typeof(IModule))]
private List<Lazy<IModule, IModuleInfo>> specific_modules { get; set; }
public ShellViewModel()
{
DirectoryCatalog catalaog = new DirectoryCatalog(System.AppDomain.CurrentDomain.BaseDirectory + @"\Modules", "*.*");
CompositionContainer compositioncontainer = new CompositionContainer(catalaog);
specific_modules = compositioncontainer.GetExportedValues<Lazy<IModule, IModuleInfo>>().ToList();
Documents = specific_modules.FirstOrDefault<Lazy<IModule, IModuleInfo>>().Metadata.DisplayName;
}
public interface IModuleInfo
{
string DisplayName { get; }
string Description { get; }
string Version { get; }
}
public interface IModule
{
string Name { get; }
}
namespace Modules
{
[Export(typeof(IModule))]
[ExportMetadata("DisplayName", "Documents")]
[ExportMetadata("Description", "gérer les docs")]
[ExportMetadata("Version", "2.1")]
public class DocumentsModule : IModule
{
public string Name
{
get
{
return "Documents";
}
}
}
}
问题出在这一行
specific_modules = compositioncontainer.GetExportedValues<Lazy<IModule, IModuleInfo>>().ToList();
您需要指定您要获取的模块的合约类型。在你的情况下,你必须这样做:
var listOfModules = compositioncontainer.GetExportedValues<IModule>().ToList();
specific_module
然后可以 filled/formed 通过使用 Select
LINQ 方法。
来源:
- T - The type of the exported object to return. The contract name is also derived from this type parameter.
- This question, although different problem contains the solution for your question
我正在尝试根据元数据导出模块。
compositioncontainer
目录中包含两个部分
[1] = {Modules.ProjectModule}
[0] = {Modules.DocumentsModule}
但是 GetExportedValues
returns 什么都没有。
[ImportMany(typeof(IModule))]
private List<Lazy<IModule, IModuleInfo>> specific_modules { get; set; }
public ShellViewModel()
{
DirectoryCatalog catalaog = new DirectoryCatalog(System.AppDomain.CurrentDomain.BaseDirectory + @"\Modules", "*.*");
CompositionContainer compositioncontainer = new CompositionContainer(catalaog);
specific_modules = compositioncontainer.GetExportedValues<Lazy<IModule, IModuleInfo>>().ToList();
Documents = specific_modules.FirstOrDefault<Lazy<IModule, IModuleInfo>>().Metadata.DisplayName;
}
public interface IModuleInfo
{
string DisplayName { get; }
string Description { get; }
string Version { get; }
}
public interface IModule
{
string Name { get; }
}
namespace Modules
{
[Export(typeof(IModule))]
[ExportMetadata("DisplayName", "Documents")]
[ExportMetadata("Description", "gérer les docs")]
[ExportMetadata("Version", "2.1")]
public class DocumentsModule : IModule
{
public string Name
{
get
{
return "Documents";
}
}
}
}
问题出在这一行
specific_modules = compositioncontainer.GetExportedValues<Lazy<IModule, IModuleInfo>>().ToList();
您需要指定您要获取的模块的合约类型。在你的情况下,你必须这样做:
var listOfModules = compositioncontainer.GetExportedValues<IModule>().ToList();
specific_module
然后可以 filled/formed 通过使用 Select
LINQ 方法。
来源:
- T - The type of the exported object to return. The contract name is also derived from this type parameter.
- This question, although different problem contains the solution for your question