我有一个使用MEF作为插件管理器的测试MVC应用程序。在一些外部库中,我使用基于公共接口的MEF导出一堆控制器:
[Export(typeof(ICustomController)), PartCreationPolicy(CreationPolicy.NonShared)]
[ExportMetadata("Feature", "Foo")]
public class FooController : Controller, ICustomController
{
}
现在我把它连接到autofac,以便我可以这样做:
var controllers = container.GetServices<ICustomController>();
我遇到的问题是我想过滤元数据值。我知道autofac强迫你在构建器中执行此操作,而不是在调用GetServices时,所以我一直在那里挖掘。问题是导出是由MEF定义的,而不是autofac,它是通用的。这是我想要做的(注意这不起作用)
builder.RegisterType<ICustomController>().Exported(x=> x.As<ICustomController>().WithMetadata("Feature", "Foo"));
我意识到这在某种意义上设定了新的类型注册。我想要它做的是意识到它已经有一个这种类型的列表,当我要求它们时,只给我那些在元数据中具有“Foo”功能的那些。
这甚至可能吗?在注射到autofac之前,有没有办法在MEF中进行?