C# Caliburn.Micro 2.0.2中DisplayRootViewFor调用GetAllInstances重写时出现异常

C# Caliburn.Micro 2.0.2中DisplayRootViewFor调用GetAllInstances重写时出现异常,c#,caliburn.micro,C#,Caliburn.micro,我正在使用Caliburn.Micro 2.0.2和默认的MEF(托管扩展框架)IoC容器配置 我正在请求一组ViewModels,这些ViewModels通过使用IoC.GetAll实现某个接口(是的,我最终将删除反模式) 前面提到的所有视图模型都使用[Export(typeof(ISupportFeatureX))]属性进行修饰 在OnStartup()中加载默认视图之前,一切都按预期工作。出于某种原因,调用了GetAllInstances()而不是GetInstance(),我得到了一个异

我正在使用Caliburn.Micro 2.0.2和默认的MEF(托管扩展框架)IoC容器配置

我正在请求一组ViewModels,这些ViewModels通过使用IoC.GetAll实现某个接口(是的,我最终将删除反模式)

前面提到的所有视图模型都使用[Export(typeof(ISupportFeatureX))]属性进行修饰

在OnStartup()中加载默认视图之前,一切都按预期工作。出于某种原因,调用了GetAllInstances()而不是GetInstance(),我得到了一个异常

"Could not locate any instances of contract <Namespace>.Views.ShellView."
“找不到contract.Views.ShellView的任何实例。”
我的CaliburnBootstrapper如下所示:

public class CaliburnBootstrapper : BootstrapperBase
{
    CompositionContainer container;

    public CaliburnBootstrapper() { this.Initialize(); }


    void ConfigureIocContainer()
    {
        try
        {
            var catalog = new AggregateCatalog(AssemblySource.Instance.Select(x => new AssemblyCatalog(x))
                                                             .OfType<ComposablePartCatalog>());
            this.container = new CompositionContainer(catalog);

            var batch = new CompositionBatch();

            var eventAggregator = new EventAggregator();
            var windowManager = new WindowManager();

            batch.AddExportedValue<IWindowManager>(windowManager);
            batch.AddExportedValue<IEventAggregator>(eventAggregator);

            batch.AddExportedValue(this.container);
            batch.AddExportedValue(catalog);

            this.container.Compose(batch);
        }
        catch (Exception e)
        {
            this.logger.Error(e);
            throw;
        }
    }
}


    protected override void BuildUp(object instance)
    {
        this.container.SatisfyImportsOnce(instance);
    }

    protected override IEnumerable<object> GetAllInstances(Type serviceType)
    {
        var contract = AttributedModelServices.GetContractName(serviceType);
        var exports = this.container.GetExportedValues<object>(contract);

        if (exports.Any()) return exports;

        throw new Exception(string.Format("Could not locate any instances of contract {0}.", contract));
    }


    protected override object GetInstance(Type serviceType, string key)
    {
        var contract = string.IsNullOrEmpty(key) ? AttributedModelServices.GetContractName(serviceType) : key;
        var exports = this.container.GetExportedValues<object>(contract);

        if (exports.Any()) return exports.First();

        throw new Exception(string.Format("Could not locate any instances of contract {0}.", contract));
    }

    protected override void OnStartup(object sender, StartupEventArgs e)
    {
        this.DisplayRootViewFor<IShellViewModel>();
    }
公共类CaliburnBootstrapper:BootstrapperBase
{
复合容器;
public CaliburnBootstrapper(){this.Initialize();}
无效配置IOCContainer()
{
尝试
{
var catalog=newaggregateCatalog(AssemblySource.Instance.Select(x=>newassemblyCatalog(x))
。of type());
this.container=新合成容器(目录);
var batch=新的CompositionBatch();
var eventAggregator=新的eventAggregator();
var windowManager=新的windowManager();
batch.AddExportedValue(windowManager);
batch.AddExportedValue(事件聚合器);
batch.AddExportedValue(this.container);
batch.AddExportedValue(目录);
此.container.Compose(批处理);
}
捕获(例外e)
{
此.logger.Error(e);
投掷;
}
}
}
受保护的覆盖空洞堆积(对象实例)
{
this.container.SatisfyImportsOnce(实例);
}
受保护的重写IEnumerable GetAllInstances(类型serviceType)
{
var contract=AttributedModelServices.GetContractName(服务类型);
var exports=this.container.GetExportedValues(合同);
如果(exports.Any())返回导出;
抛出新异常(string.Format(“找不到合同{0}.”,合同的任何实例”);
}
受保护的覆盖对象GetInstance(类型serviceType,字符串键)
{
var contract=string.IsNullOrEmpty(key)?AttributedModelServices.GetContractName(serviceType):key;
var exports=this.container.GetExportedValues(合同);
if(exports.Any())返回exports.First();
抛出新异常(string.Format(“找不到合同{0}.”,合同的任何实例”);
}
启动时受保护的覆盖无效(对象发送方、StartupEventArgs e)
{
这个.DisplayRootViewFor();
}
“我的视图”和“视图模型”位于不同的项目中,因此SelectAssemblys将覆盖

    protected override IEnumerable<Assembly> SelectAssemblies()
    {
        var assemblies = new List<Assembly>();
        assemblies.Add(typeof (IShellViewModel).Assembly);
        assemblies.Add(typeof (ShellView).Assembly);
        return assemblies;
    }
受保护的重写IEnumerable SelectAssemblys()
{
var assemblies=新列表();
添加(typeof(IShellViewModel).Assembly);
Add(typeof(ShellView).Assembly);
返回组件;
}
在我覆盖GetAllInstances()之前,该应用程序与Caliburn.Micro设置配合良好。查看Caliburn.Micro源代码,我在DisplayRootViewFor()调用链中看不到对GetAllInstances()的任何调用


关于为什么GetInstance()解析ShellView,但GetAllInstances()中的相同代码却不能解析,有什么解释吗?

Caliburn.Micro(CM)的默认行为是为您实例化我们的视图。一旦覆盖“GetAllInstances”,CM将不再为您创建视图实例,而是从容器中查找对象

由于视图未注册到容器中(在本例中,使用MEF[Export]属性),因此当在容器中找不到请求的视图时,GetAllInstances调用会引发异常

这是一个不理解Caliburn.Micro和MEF作为IoC容器的内部结构的简单问题