使用 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.
}
其中 ITicker
和 ITestExplorer
都继承自同一个 ICoreDataProvider
接口
public interface ITicker : ITool, ICoreDataProvider { }
和
public interface ITestExplorer : ITool, ICoreDataProvider { }
我知道这两个界面本质上是相同的,但是,它们是必需的,因为我正在使用 Caliburn micro 启动具有不同 类 的某些视图类型继承自上述每一个。
我的问题是我希望 [ImportMany]
ICoreDataProviders
,但我无法将上述 类 导出为 ITicker
和 ICoreDataProvider
(或 ITestExplorer
和 ICoreDataProvider
) [单个属性中的多个导出]。我想做
[ImportMany]
private IEnumerable<IBetDataProvider> dataProviderCollection;
但我无法将导出类型切换为 ICoreDataProvider
,因为它们当前用于启动视图等。
- 我可以要求 MEF 导入 "all type that implement
ICoreDataProvider
",还是导出必须是显式的?
- 如果上面的答案是"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.
}
[请注意围绕这个主题有一些问题,但是 none 似乎与这个特定案例相匹配]
我有两个导出它们自己的接口类型的 ViewModels
[Export(typeof(ITestExplorer))]
public class TestExplorerViewModel : Tool, ITestExplorer, IDataErrorInfo, IDisposable
{
// Implementation.
}
和
[Export(typeof(ITicker))]
public class TickerViewModel : Tool, ITicker, IDataErrorInfo
{
// Implementation.
}
其中 ITicker
和 ITestExplorer
都继承自同一个 ICoreDataProvider
接口
public interface ITicker : ITool, ICoreDataProvider { }
和
public interface ITestExplorer : ITool, ICoreDataProvider { }
我知道这两个界面本质上是相同的,但是,它们是必需的,因为我正在使用 Caliburn micro 启动具有不同 类 的某些视图类型继承自上述每一个。
我的问题是我希望 [ImportMany]
ICoreDataProviders
,但我无法将上述 类 导出为 ITicker
和 ICoreDataProvider
(或 ITestExplorer
和 ICoreDataProvider
) [单个属性中的多个导出]。我想做
[ImportMany]
private IEnumerable<IBetDataProvider> dataProviderCollection;
但我无法将导出类型切换为 ICoreDataProvider
,因为它们当前用于启动视图等。
- 我可以要求 MEF 导入 "all type that implement
ICoreDataProvider
",还是导出必须是显式的? - 如果上面的答案是"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.
}