我正在使用带有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)
{
}
答案 0 :(得分:1)
通常,您需要在构造函数的参数上放置ImportManyAttribute
,因为它们是集合导入。由于其中一个正在工作,我怀疑MEFContrib正在做一些事情,所以你不需要这样做,但它只适用于IEnumerable<T>
而不是T的数组。所以尝试将第一个参数更改为{ {1}},或在其前面添加IEnumerable<Lazy<IPublishService, IPluginMetadata>>
。
我注意到的其他一些问题:您的ImportManyAttribute
来自PluginMetadataAttribute
。您这样做的原因是您不必在服务上同时包含导出和元数据属性。但是,传递给基类构造函数的类型是导出的合约。因此,这应该是ExportAttribute
而不是IPublishService
。进行更改并从SamplePublishService中删除Export属性。