【问题标题】:Resolve Views through IoC or MEF instead of using SelectedAssemblies() method通过 IoC 或 MEF 解析视图,而不是使用 SelectedAssemblies() 方法
【发布时间】:2014-08-08 10:15:33
【问题描述】:

我将 Caliburn.Micro 与 Spring.net 一起使用,而不是默认的简单 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 执行此任务? 问题是引导程序没有可以覆盖的虚拟方法来解决请求的视图。改变这种行为的出发点是什么?我认为必须存在类似的东西

protected virtual Control ResolveViewForModel(Type modelType) {...}

感谢任何提示。

【问题讨论】:

    标签: mvvm mef ioc-container caliburn.micro


    【解决方案1】:

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

    查看ViewLocator 方法LocateTypeForModelType 似乎它要求AssemblySource 提供应与View-naming conventions 核对的可用类型。

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

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

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

    最后回答您的问题:“通过 IoC 或 MEF 解决视图而不是使用 SelectedAssemblies() 方法”:Imo 这种违反 Caliburn.Micro 的哲学:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-18
      • 1970-01-01
      • 1970-01-01
      • 2011-07-24
      • 2010-09-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多