1

我正在尝试在 WPF MVVM 应用程序中实现 Unity,但我错过了大局。

此刻,我创建了一个像这样的引导程序:

  public class MainBootstrapper : Bootstrapper<MainViewModel>
  {
    private UnityContainer container;

    protected override void Configure()
    {
      container = new UnityContainer();
      container.RegisterType<IServiceLocator, UnityServiceLocator>(new ContainerControlledLifetimeManager());
      container.RegisterType<IWindowManager, WindowManager>(new ContainerControlledLifetimeManager());
      container.RegisterType<IEventAggregator, EventAggregator>(new ContainerControlledLifetimeManager());
    }

    protected override object GetInstance(Type service, string key)
    {
      if (service != null)
      {
        return container.Resolve(service);
      }

      if (!string.IsNullOrWhiteSpace(key))
      {
        return container.Resolve(Type.GetType(key));
      }

      return null;
    }

    protected override IEnumerable<object> GetAllInstances(Type service)
    {
      return container.ResolveAll(service);
    }

    protected override void BuildUp(object instance)
    {
      container.BuildUp(instance);
    }
  }

如何使用它的最佳方法是什么?此代码当前有效:

  public class MainViewModel : PropertyChangedBase
  {
    public MainViewModel()
    { }

    [Dependency]
    public Sub1ViewModel Sub1VM { get; set; }
    [Dependency]
    public Sub2ViewModel Sub2VM { get; set; }
  }

MainView 有这个:

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="*" />
        <RowDefinition Height="*" />
    </Grid.RowDefinitions>

    <ContentControl Grid.Row="0" Name="Sub1VM" />
    <ContentControl Grid.Row="1" Name="Sub2VM" />

</Grid>

首先:我分享的代码,这是使用Unity + Caliburn的正确方法吗?

现在假设我的 Sub1VM 使用模型“M1”,但 Sub2VM 需要使用相同的模型来显示信息,而不是通过创建模型 M1 的另一个实例。(单件)

这现在如何运作?显示我在每个视图模型构造函数中使用 IServiceLocator 吗?有人可以分享一个代码示例来解释它吗?

4

2 回答 2

1

我不特别了解 Unity,但您的配置看起来是正确的。

至于你的注射点。我想说,与其进行属性注入,不如进行构造函数注入。您所做的很好,但是您可能想要查找屏幕和导体,这些允许您将生命周期添加到 ViewModel。通常它看起来像这样:

  • Bootstrapper 打开 ShellViewModel

  • ShellViewModel 通过 Tor 注入接收 MainViewModel 作为 IConductorOneActive

  • MainViewModel 采用 IScreens 的集合。

  • ShellViewModel 在 MainViewModel 上调用 MainViewModels 激活方法。

请参阅屏幕、导体和组成。正如我上面所说,你的方式很好,但它有点在手动方面,这意味着你必须手动连接所有东西。

于 2013-05-27T09:29:29.130 回答
1

首先,我同意 McDonnellDean 的观点,即您应该阅读有关屏幕、导体和组成的文章(如果我是您,我也会阅读之前的所有文章以了解 Caliburn.Micro 的工作原理。)。除此之外,您正确实现了 Unity,您可以检查Unity 作为 Caliburn.Micro 的 IoC 容器以获取更多信息。另一方面,您在这里混合了两个概念,即依赖注入和 MVVM。关于您关于模型的问题,我也更喜欢构造函数注入,如果您想要模型的单个实例,也许您可​​以注入一个为您创建该模型的工厂并将其包装到两个不同的视图模型中并通过两种不同的属性。最后,我真的鼓励你阅读教程(从这里开始),至少是基本主题。

于 2013-05-30T16:42:47.270 回答