使用 MEF 导入从给定接口继承的类型

Using MEF to Import Types that Inherit from a given Interface

[请注意围绕这个主题有一些问题,但是 none 似乎与这个特定案例相匹配]

我有两个导出它们自己的接口类型的 ViewModels

[Export(typeof(ITestExplorer))]
public class TestExplorerViewModel : Tool, ITestExplorer, IDataErrorInfo, IDisposable
{
    // Implementation.
}

[Export(typeof(ITicker))]
public class TickerViewModel : Tool, ITicker, IDataErrorInfo
{
    // Implementation.
}

其中 ITickerITestExplorer 都继承自同一个 ICoreDataProvider 接口

public interface ITicker : ITool, ICoreDataProvider { }

public interface ITestExplorer : ITool, ICoreDataProvider { }

我知道这两个界面本质上是相同的,但是,它们是必需的,因为我正在使用 Caliburn micro 启动具有不同 类 的某些视图类型继承自上述每一个。

我的问题是我希望 [ImportMany] ICoreDataProviders,但我无法将上述 类 导出为 ITickerICoreDataProvider(或 ITestExplorerICoreDataProvider) [单个属性中的多个导出]。我想做

[ImportMany]
private IEnumerable<IBetDataProvider> dataProviderCollection;

但我无法将导出类型切换为 ICoreDataProvider,因为它们当前用于启动视图等。

  1. 我可以要求 MEF 导入 "all type that implement ICoreDataProvider",还是导出必须是显式的?
  2. 如果上面的答案是"yes",怎么办?如果"no",还有其他使用MEF的方法吗?

我知道我可以通过像

这样的方式使用反射来捏造这个
var instances = 
    from t in Assembly.GetExecutingAssembly().GetTypes()
    where t.GetInterfaces().Contains(typeof(ISomething))
         && t.GetConstructor(Type.EmptyTypes) != null
    select Activator.CreateInstance(t) as ISomething;

但我不喜欢这样,因为我需要对视图是否打开等进行各种检查。

感谢您的宝贵时间。

I can't export the above classes as both ITicker and ICoreDataProvider ... [multiple exports in a single attribute]

您可以将它们导出为两个接口,只需添加两次导出属性即可。

[Export(typeof(ITestExplorer))]
[Export(typeof(ICoreDataProvider))]
public class TestExplorerViewModel : Tool, ITestExplorer, IDataErrorInfo, IDisposable
{
    // Implementation.
}

[Export(typeof(ITicker))]
[Export(typeof(ICoreDataProvider))]
public class TickerViewModel : Tool, ITicker, IDataErrorInfo
{
    // Implementation.
}