MEF ImportMany不Caliburn.Micro

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>(); 
+0

向我们展示如何使用ModuleAttribute。问题可能在于此。 – 2013-04-11 09:38:51

+0

我已经更新了我的问题 – 2013-04-11 13:53:26

您需要检查以确保您匹配的合同意味着挖掘元数据。虽然我建议您这样做,这样您可以看到MEF如何将所有零件组合在一起,但您应该尝试指定type for ImportMany

另一件要检查的是如何创建BaseViewModel。如果您从shell或其他位置执行了新的BaseViewModel(),则MEF将无法在类中使用它的魔法。 MEF需要创建任何将使用MEF的对象。

+0

我的BaseViewModel是从实现IScreen的屏幕继承的 – 2013-04-11 14:52:21

+0

这并不重要,这一切都取决于如何创建对象。 – 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

+0

没有这方面的帮助,我试过你说的,但仍然是空的 – 2013-04-11 16:49:43

+0

你没有合同试过吗?将它从导出(通过将其设置为空)和导入(保持原样)中删除。如果仍然无法使用DisableSilentRejection选项创建组合容器并检查拒绝原因。 – 2013-04-11 17:28:48