MEF ImportMany不与Caliburn.Micro合作

时间:2013-04-10 22:28:06

标签: c# .net wpf mef 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>();

3 个答案:

答案 0 :(得分:0)

您需要检查以确保您正在匹配合同,这意味着需要深入了解元数据。虽然我建议这样做,以便您可以看到MEF如何将所有部分放在一起,您应该尝试指定type for ImportMany

答案 1 :(得分:0)

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

答案 2 :(得分:0)

由于您正在使用合同进行出口,因此您需要使用相同的合同进行导入。

像:

[ImportMany("Unit")]
public IEnumerable<Lazy<IScreen, IModuleMetadata>> Mods

另一种方法是将导出修改为:

[Module(null, Module = "Stock")]
class UnitViewModel : BaseViewModel, ICUDB, IHandle<UnitModel>

通过传递null或空字符串作为契约,将使用该类型。

如果您不总是需要合同,那么您可以向ModuleAttribute添加无参数.ctor。