我一直试图想这几天,没有运气.
我正在尝试使用[ImportMany]从一个充满DLL的目录导入IEditorSystem类型的导出,它具有IEditorSystemMetadata类型的自定义元目.我想首先获取元数据,并将其推送到一些文本框等,以便用户可以选择使用哪个EditorSystem,并在选择时加载该系统......
我一直在尽可能地遵循示例,这是我到目前为止所拥有的.
[ImportMany]
public ObservableCollection<Lazy<IEditorSystem, IEditorSystemMetadata>> EditorSystemList
Run Code Online (Sandbox Code Playgroud)
这是它应该导入的内容:
[Export(typeof(IEditorSystem))]
[SignalSystemData("Very Very Long Name", "Short Name")]
public class MyEditorSystem: IEditorSystem
{
public MyEditorSystem()
{
}
}
Run Code Online (Sandbox Code Playgroud)
和创业公司:
AggregateCatalog Catalog = new AggregateCatalog(
new DirectoryCatalog(@".\EditorSystems"),
new AssemblyCatalog(Assembly.GetExecutingAssembly()));
CompositionContainer Container = new CompositionContainer(Catalog);
Container.ComposeParts(this);
Run Code Online (Sandbox Code Playgroud)
我可以在Catalog.Part中看到MyEditorSystem和具有ImportMany的viewmodel,但是从未填充EditorSystemList.我没有写作错误.
我认为这可能与Lazy <>有关,所以我试过了
public ObservableCollection<IEditorSystem> EditorSystemList
Run Code Online (Sandbox Code Playgroud)
也没有运气.
我能想到的唯一复杂因素是我正在使用Cinch,它使用MEFedMVVM,它也使用MEF.我认为它不会干扰,但我不确定.
我想我做错了,有人能理解这个吗?
更新:
实现一个新的IComposer,其中包含您需要的目录.
虽然ImportMany仍然失败,但只有在我尝试使用它导入元数据时才会失败.元数据只是几个字符串,据我所知,遵循示例.
最后找到原因:IEditorSystem的实现是在一个单独的DLL中,如前所述.但是,dll的任何新版本都不会复制到主项目的输出子目录中.我手动复制了第一个,忘了将后期构建副本添加到dll项目中.哦,好好学习了一堆关于MEF的东西,所以不是完全浪费了几天:)
在没有看到你的代码的情况下,我相信你需要改变的是
public ObservableCollection<Lazy<IEditorSystem, IEditorSystemMetadata>> EditorSystemList
Run Code Online (Sandbox Code Playgroud)
应该
public IEnumerable<Lazy<IEditorSystem, IEditorSystemMetadata>> EditorSystemList;
Run Code Online (Sandbox Code Playgroud)
这是一个示例:
class Program
{
static void Main(string[] args)
{
var c = new Class1();
var v = c.EditorSystemList;
foreach (var lazy in v)
{
if (lazy.Metadata.LongName == "Very Very Long Name")
{
var v2 = lazy.Value;
// v2 is the instance of MyEditorSystem
}
}
}
}
public class Class1
{
[ImportMany]
public IEnumerable<Lazy<IEditorSystem, IEditorSystemMetadata>> EditorSystemList;
public Class1()
{
var catalog = new AggregateCatalog(
new AssemblyCatalog(Assembly.GetExecutingAssembly()));
var container = new CompositionContainer(catalog);
container.ComposeParts(this);
}
}
[Export(typeof(IEditorSystem))]
[SignalSystemData("Very Very Long Name", "Short Name")]
public class MyEditorSystem : IEditorSystem { }
public interface IEditorSystem { }
[MetadataAttribute]
[AttributeUsage(AttributeTargets.Class, AllowMultiple = false)]
public class SignalSystemDataAttribute : ExportAttribute
{
public SignalSystemDataAttribute(string longName, string shortName)
: base(typeof(IEditorSystem))
{
LongName = longName;
ShortName = shortName;
}
public string LongName { get; set; }
public string ShortName { get; set; }
}
public interface IEditorSystemMetadata
{
string LongName { get; }
string ShortName { get; }
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4106 次 |
| 最近记录: |