【发布时间】:2014-04-22 16:03:53
【问题描述】:
我有一个 Caliburn Micro 的引导程序,我使用 MEF 作为 IoC。接口实现者之一可以从它的构造函数中抛出异常。因此,当我执行以下操作时:
CompositionBatch batch = new CompositionBatch();
batch.AddExportedValue<IFrProvider>(new ShtrihFr());
然后我在应用程序启动时遇到异常,但我想在解决时得到它。 如何使用 MEF 实现这一目标?
更新 1。
我做了什么:
[Export(typeof (LoadingViewModel))]
public class LoadingViewModel {
public LoadingViewModel() {}
[Import]
private readonly IFrProvider frProvider;
}
[Export(typeof(IFrProvider))]
public class ShtrihFr : IFrProvider {
[ImportingConstructor]
public ShtrihFr(int password = 1) {
}
}
所以当我执行以下操作时:
protected override object GetInstance(Type serviceType, string key) {
string contract = string.IsNullOrEmpty(key) ? AttributedModelServices.GetContractName(serviceType) : key;
IEnumerable<object> exports = container.GetExportedValues<object>(contract);
var exportedList = exports as IList<object> ?? exports.ToList();
if (exportedList.Any())
return exportedList.First();
throw new Exception(string.Format("Could not locate any instances of contract {0}.", contract));
}
exportedList 计数为 0。它找不到实现。我检查了容器是否包含 ShtrihFr 实现的一部分。如何解决问题?
更新 2。 出于调试目的,我确实在 GetInstance 方法的开头添加了以下内容:
if (serviceType.FullName == "Microtech.Hardware.IFrProvider") {
var export = container.GetExport<IFrProvider>();
var frProvider = export.Value;
}
在 container.GetExport 行,我得到 ImportCardinalityMismatchException。未找到与约束匹配的导出...
【问题讨论】:
-
问题在于采用 int 值的构造函数。它也应该为 MEF 导出。
标签: wpf inversion-of-control mef ioc-container caliburn.micro