我在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) {...}
感谢任何提示。
答案 0 :(得分:1)
首先,我不知道caliburn.micro所以这可能是错误的。
查看ViewLocator
方法LocateTypeForModelType
,它似乎要求AssemblySource
提供应根据View-naming conventions检查的可用类型。
由于以上所有都是静态类,我怀疑无法继承和覆盖该行为。由于它们是静态的,因此可以将程序集添加到公共可观察字典中 - 感觉有点像黑客,而SelectAssemblies
似乎是正确的方式。
然而,在我看来,由于存在解析Views
和ViewModels
的约定,因此可以对程序集执行相同的操作,这会引出我们的问题:如何确定要扫描的程序集ViewModels
/ Views
。
该策略可以构建到SelectAssemblies
方法中。
如果您想更改caliburn.micro在这些程序集中找到正确的视图的方式,请有效地更改/添加exisiting约定,there is an explanation in their wiki。
最后回答你的问题:&#34; 通过IoC或MEF解析视图而不是使用SelectedAssemblies()方法&#34;:Imo这种打败了Caliburn.Micro的理念:
Caliburn.Micro使用约定来解析给定程序集中的视图 - 尝试使用IoC容器而不是基于名称/命名空间的约定与该方法相矛盾。