我用的是Caliburn。Micro with Spring.net,而不是默认的简单IoC。我的自定义Bootstrapper(从Caliburn的BootstrapperBase派生)正在工作,我可以在Spring.net中定义ViewModels。但是视图仍然由执行程序集的反射(名称约定)解析。我使用Bootstrapper的以下方法来添加用于解析ViewModels视图的程序集。
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) {...}
谢谢你的提示
首先,我不知道口径。这可能是错误的。
查看ViewLocator
方法LocateTypeForModelType
,它似乎要求AssemblySource
提供可用的类型,这些类型应该根据视图命名约定进行检查。
由于以上都是静态类,我怀疑没有办法继承和覆盖该行为。因为它们是静态的,所以可以直接将程序集添加到公共可观察字典中——这感觉有点hack,而SelectAssemblies
似乎是正确的方法。
然而,在我看来,既然有解决Views
和ViewModels
的约定,人们可以为程序集做同样的事情,这给我们带来了一个问题:你如何决定哪些程序集要扫描ViewModels
/Views
。该策略可以内置到SelectAssemblies
方法中。
如果你想改变如何校准。Micro在这些程序集中找到正确的视图,有效地改变/添加到现有的约定中,在他们的wiki中有解释。
最后回答你的问题:"通过IoC或MEF解析视图,而不是使用SelectedAssemblies()方法":在我看来,这有点违背了Caliburn的哲学。微观:
这份原稿。Micro使用约定从给定的程序集解析视图——尝试使用IoC容器而不是基于名称/名称空间的约定与这种方法相矛盾。