MEF ImportMany不Caliburn.Micro
在这里工作是我的元数据:MEF ImportMany不Caliburn.Micro
[MetadataAttribute]
[AttributeUsage(AttributeTargets.Class, AllowMultiple = false)]
public class ModuleAttribute : ExportAttribute, IModuleMetadata
{
public ModuleAttribute(string Contract) : base(Contract,typeof(IScreen))
{
Region = Region.Sidebar;
IsVisible = true;
Order = short.MaxValue;
Description = string.Empty;
}
public string Module { get; set; }
public Region Region { get; set; }
public string DisplayName { get; set; }
public bool IsVisible { get; set; }
public string Description { get; set; }
public short Order { get; set; }
}
我的界面:
public interface IModuleMetadata
{
string Module { get; set; }
Region Region { get; set; }
string DisplayName { get; set; }
bool IsVisible { get; set; }
string Description { get; set; }
short Order { get; set; }
}
我使用访问:
[ImportMany]
public IEnumerable<Lazy<IScreen, IModuleMetadata>> Mods
{
get;
set;
}
但始终我MODS的结束是null
。
更新:
[Module("Unit", Module = "Stock")]
class UnitViewModel : BaseViewModel, ICUDB, IHandle<UnitModel>
{
有趣的是,当我问使用GetExport。我得到所有15个导出的类。
var ex = container.GetExports<IScreen, JIMS.Common.Interface.IModuleMetadata>();
另一件要检查的是如何创建BaseViewModel。如果您从shell或其他位置执行了新的BaseViewModel(),则MEF将无法在类中使用它的魔法。 MEF需要创建任何将使用MEF的对象。
我的BaseViewModel是从实现IScreen的屏幕继承的 – 2013-04-11 14:52:21
这并不重要,这一切都取决于如何创建对象。 – 2013-04-11 17:42:57
由于您正在使用合同进行出口,因此您需要输入相同的合同。
像:
[ImportMany("Unit")]
public IEnumerable<Lazy<IScreen, IModuleMetadata>> Mods
另一个方法,使这项工作是修改出口到:
[Module(null, Module = "Stock")]
class UnitViewModel : BaseViewModel, ICUDB, IHandle<UnitModel>
通过传递null或空字符串作为合同那么类型会用过的。
如果您并不总是需要合同,那么您可以将一个无参数的.ctor添加到ModuleAttribute
。
没有这方面的帮助,我试过你说的,但仍然是空的 – 2013-04-11 16:49:43
你没有合同试过吗?将它从导出(通过将其设置为空)和导入(保持原样)中删除。如果仍然无法使用DisableSilentRejection选项创建组合容器并检查拒绝原因。 – 2013-04-11 17:28:48
向我们展示如何使用ModuleAttribute。问题可能在于此。 – 2013-04-11 09:38:51
我已经更新了我的问题 – 2013-04-11 13:53:26