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



我用的是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似乎是正确的方法。

然而,在我看来,既然有解决ViewsViewModels的约定,人们可以为程序集做同样的事情,这给我们带来了一个问题:你如何决定哪些程序集要扫描ViewModels/Views。该策略可以内置到SelectAssemblies方法中。

如果你想改变如何校准。Micro在这些程序集中找到正确的视图,有效地改变/添加到现有的约定中,在他们的wiki中有解释。

最后回答你的问题:"通过IoC或MEF解析视图,而不是使用SelectedAssemblies()方法":在我看来,这有点违背了Caliburn的哲学。微观:

这份原稿。Micro使用约定从给定的程序集解析视图——尝试使用IoC容器而不是基于名称/名称空间的约定与这种方法相矛盾。

相关内容

  • 没有找到相关文章

最新更新