【发布时间】:2016-07-14 17:16:21
【问题描述】:
我正在尝试使用 MEF 构建模块化应用程序。
但是,在编写时它似乎忽略了SetExportedValue(..., ...),导致它找不到我需要的值/对象。
这是我的(匿名和简化的)代码:
interface IPlugin { }
class MyClass
{
[ImportsMany(typeof(IPlugin))]
public IEnumerable<Lazy<IPlugin>> Plugins;
public LoadParts()
{
var ac = new AggregateCatalog();
ac.Catalogs.Add(new AssemblyCatalog(typeof(PluginManager).Assembly));
// imagine adding some DirectoryCatalogs here
var cc = new CompositionContainer(ac);
cc.ComposeExportedValue("MyValue", someinstance);
cc.ComposeParts(this);
}
}
[Export(typeof(IPlugin))]
class MyPart : IPlugin
{
[ImportingConstructor]
public MyPart([Import("MyValue")] sometype arg)
{ }
}
这会导致以下错误消息:
System.ComponentModel.Composition 警告:1:ComposablePartDefinition 'MyNamespace.MyPart' 已被拒绝。组成保持不变。由于以下错误,更改被拒绝: 合成产生了单个合成错误。下面提供了根本原因。查看 CompositionException.Errors 属性以获取更多详细信息。
1) 未找到与约束匹配的导出:
ContractName MyValue RequiredTypeIdentity somenamespace.sometype导致:无法在部件“MyNamespace.MyPart”上设置导入“MyNamespace.MyPart..ctor (Parameter="...", ContractName="...")'。
元素:MyNamespace.MyPart..ctor (Parameter="...", ContractName="...") --> MyNamespace.MyPart --> DirectoryCatalog (Path="./")
我是否误解了部分构造函数的工作原理?
如何让它接受构造函数参数?
编辑澄清:someinstance 是sometype 的特定实例。我不想向容器添加类型,而是添加特定的类实例。
【问题讨论】:
标签: c# .net constructor mef