ASP.NET MVC + MEF + MefContrib:似乎无法从Exports获取元数据

时间:2011-02-25 20:29:54

标签: asp.net-mvc-3 mef

我正在使用带有MEF + MEFContrib的asp.net mvc3来加载我的控制器上的一些服务。发生的事情是我可以使用IEnumerable<IPublishService> publishers加载服务 - [ImportingConstructor] - 但是当我尝试使用元数据加载服务时Lazy<IPublishService, IPluginMetaData>[] publishers - 我得到一个空数组。

对于为什么有任何想法?感谢。

我的代码:

public interface IPluginMetaData
{
    string Name { get; }
    string Version { get; }
}

[MetadataAttribute]
[AttributeUsage(AttributeTargets.Class, AllowMultiple = false)]
public class PluginMetadataAttribute : ExportAttribute
{
    public PluginMetadataAttribute(string name, string version)
        : base(typeof(IPluginMetaData))
    {
        Name = name;
        Version = version;
    }

    public string Name { get; set; }
    public string Version { get; set; }
}

[Export(typeof(IPublishService))]
[PluginMetadata("Default", "1.0.0.0")]
public class SamplePublishService : IPublishService
{

}

[ImportingConstructor]
public HomeController(Lazy<IPublishService, IPluginMetaData>[] publisher /* Empty Array */ , IEnumerable<IPublishService> publishers /* Array with 1 service */)
{
}

更新(基于丹尼尔答案,但仍然没有)

[MetadataAttribute]
[AttributeUsage(AttributeTargets.Class, AllowMultiple = false)]
public class PluginMetadataAttribute : ExportAttribute
{
    public PluginMetadataAttribute(string name, string version)
        : base(typeof(IPublishService))
    {
        Name = name;
        Version = version;
    }

    public string Name { get; set; }
    public string Version { get; set; }
}

[PluginMetadata("Default", "1.0.0.0")]
public class GoogleSampleGroupPublishService : IPublishService
{
}

[ImportingConstructor]
public HomeController([ImportManyAttribute]Lazy<IPublishService, IPluginMetaData>[] publisher)
{
}

1 个答案:

答案 0 :(得分:1)

通常,您需要在构造函数的参数上放置ImportManyAttribute,因为它们是集合导入。由于其中一个正在工作,我怀疑MEFContrib正在做一些事情,所以你不需要这样做,但它只适用于IEnumerable<T>而不是T的数组。所以尝试将第一个参数更改为{ {1}},或在其前面添加IEnumerable<Lazy<IPublishService, IPluginMetadata>>

我注意到的其他一些问题:您的ImportManyAttribute来自PluginMetadataAttribute。您这样做的原因是您不必在服务上同时包含导出和元数据属性。但是,传递给基类构造函数的类型是导出的合约。因此,这应该是ExportAttribute而不是IPublishService。进行更改并从SamplePublishService中删除Export属性。