通过IoC或MEF解析视图,而不是使用SelectedAssemblies()方法

时间:2014-06-18 08:01:14

标签: mvvm mef ioc-container caliburn.micro

我在Spring.net中使用Caliburn.Micro而不是默认的简单IoC。我的自定义Bootstrapper(来自Caliburn的BootstrapperBase)正在运行,我可以在Spring.net中定义ViewModel。但是视图仍然通过执行程序集中的反射(名称约定)来解决。我使用Bootstrapper的以下方法添加程序集来解析ViewModel的视图。

    protected override IEnumerable<Assembly> SelectAssemblies()
    {
        // hmm, want to change the way how the view is resolved... how to do this?
        // ... use IoC or MEF for this task instead?
        return new[]
                   {
                       // don't want to add every dll here
                       this.GetType().Assembly,
                       Assembly.Load("MyViewModels.Assembly") 
                   };
    }

如何更改解析视图的行为以及使用IoC或MEF执行此任务? 问题是Bootstrapper没有覆盖哪个虚拟方法来解析请求的视图。改变这种行为的起点是什么?我认为必须存在像

这样的东西
protected virtual Control ResolveViewForModel(Type modelType) {...}

感谢任何提示。

1 个答案:

答案 0 :(得分:1)

首先,我不知道caliburn.micro所以这可能是错误的。

查看ViewLocator方法LocateTypeForModelType,它似乎要求AssemblySource提供应根据View-naming conventions检查的可用类型。

由于以上所有都是静态类,我怀疑无法继承和覆盖该行为。由于它们是静态的,因此可以将程序集添加到公共可观察字典中 - 感觉有点像黑客,而SelectAssemblies似乎是正确的方式。

然而,在我看来,由于存在解析ViewsViewModels的约定,因此可以对程序集执行相同的操作,这会引出我们的问题:如何确定要扫描的程序集ViewModels / Views。 该策略可以构建到SelectAssemblies方法中。

如果您想更改caliburn.micro在这些程序集中找到正确的视图的方式,请有效地更改/添加exisiting约定,there is an explanation in their wiki

最后回答你的问题:&#34; 通过IoC或MEF解析视图而不是使用SelectedAssemblies()方法&#34;:Imo这种打败了Caliburn.Micro的理念:

Caliburn.Micro使用约定来解析给定程序集中的视图 - 尝试使用IoC容器而不是基于名称/命名空间的约定与该方法相矛盾。