4

我在这里使用 Caliburn.Micro 引导程序:

https://gist.github.com/1127914

如果我将所有视图和视图模型与引导程序保持在同一个项目中,那么一切正常。

但是我想将 Views 和 ViewModels 文件夹推送到另一个程序集/项目,我这样做了,更改命名空间,更新引导程序以找到该视图模型。现在,当我运行时,我得到了关于

“找不到支持服务 MVVMBook.ViewModules.ViewModels.MainViewModel 的组件”

在引导程序的这一部分:

return string.IsNullOrWhiteSpace(key)
               ? _container.Resolve(service)
               : _container.Resolve(key, service);

显然它无法连接 ViewModel,即使 VM 被设置为 Bootstrapper 的通用参数:

 public class CastleBootstrapper : Bootstrapper<MainViewModel>

我使用的命名约定是一个名为 Views 的文件夹和一个名为 ViewModels 的文件夹,文件是 MainView.xaml 和 MainViewModel.cs

我在哪里可以告诉它在这个程序集中查看?

当视图和视图模型位于单独的程序集中但未解决问题时,建议将此部分添加到引导程序中:

// needed if views and viewmodels are in a seperate assembly
  protected override IEnumerable<Assembly> SelectAssemblies()
  {
     return new[]
               {
                  Assembly.GetExecutingAssembly()
               };
  }
4

1 回答 1

7

未找到您的 ViewModel,因为它没有注册。引导程序附带的 ApplicationContainer 类有一个 RegisterViewModels 方法,如下所示:

private void RegisterViewModels()
{
    Register(AllTypes.FromAssembly(GetType().Assembly)
                    .Where(x => x.Name.EndsWith("ViewModel"))
                    .Configure(x => x.LifeStyle.Is(LifestyleType.Transient)));
}

这只会在 ApplicationContainer 所在的程序集中注册 ViewModel。

我想您将这些类粘贴到您的项目中,以便您可以修改它们。如果是这种情况,您可以修改应用程序容器 RegisterViewModels 或修改 CastleBootstrapper 并覆盖 Configure() 方法,如下所示:

protected override void Configure()
{
     _container = new ApplicationContainer();
     _container.AddFacility<TypedFactoryFacility>();
     _container.Register(AllTypes.FromAssembly(typeof(MainViewModel).Assembly)
         .Where(x => x.Name.EndsWith("ViewModel") || x.Name.EndsWith("View"))
         .Configure(x => x.LifeStyle.Is(LifestyleType.Transient)));
}

以上将注册所有视图模型和视图。要使 Caliburn 正确定位视图,请更新 SelectAssemblies() 方法:

protected override IEnumerable<Assembly> SelectAssemblies()
{
   return new[]
   {
       Assembly.GetExecutingAssembly(),
       typeof(MainViewModel).Assembly
   };
}

有关 Castle.Windsor 的更多信息,请访问 http://stw.castleproject.org/Windsor.MainPage.ashx

于 2012-04-26T20:45:06.013 回答