在WPF中使用Unity

时间:2011-03-01 18:54:04

标签: c# wpf unity-container ioc-container unity2.0

我让Unity 2.0在App.xaml.cs中运行良好,可以在该类中注册和解析。

我的问题是关于最佳做法。

我有许多用户控件和其他类也需要解决一些相同的新接口< - >实现。问题是无法访问我在App.xaml.cs中创建的Unity容器。

我不能使用构造函数或属性注入来传递容器引用。

  1. 太多(它是一个大型项目)
  2. 用户控件通过xaml
  3. 添加
  4. 有几个非常松散 项目中相关的“模块” 可以共享同一个容器 配置。
  5. 我宁愿不在每个需要访问容器的对象的配置文件中重新创建容器。

    在同一个程序集的各个“模块”中需要同一个容器作为服务时,是否有任何最佳实践建议?

    感谢。

1 个答案:

答案 0 :(得分:4)

我认为将ControlsIoC放在一起至少是代码中的痛苦。可能有人会争辩,但IMO避免这种痛苦的最佳做法是MVVM。您将拥有可以使用Unity自由构建的viewModel,并将所需内容注入其中。您将拥有与viewModel绑定的视图,而没有理由知道任何大量的控制反转。

更新:根据评论:

App.xaml.cs:

    private void HandleStartup(object sender, StartupEventArgs e)
    {
        var container = CreateContainer(); // create IoC container
       var mainViewModel = container.Resolve<MainViewModel>();
        var shell = new Shell { DataContext = mainViewModel }; // main View
        MainWindow = shell;
        shell.Show();
    }

Shell XAML示例:

<UserControl>
     <StackPanel>
          <ContentPresenter Content="{Binding ViewModel1}" />
          <ContentPresenter Content="{Binding ViewModel2}" />
          <ContentPresenter Content="{Binding ViewModel3}" />
     </StackPanel>
</UserControl>

MainViewModel:

public class MainViewModel
{
     public ViewModel1 ViewModel1 { get; private set; }
     public ViewModel2 ViewModel2 { get; private set; }
     public ViewModel3 ViewModel3 { get; private set; }

     // this will be handled by IoC container
     public MainViewModel(ViewModel1 viewModel1, ViewModel2 viewModel2, ViewModel3 viewModel3)
    {
        ViewModel1 = viewModel1;
        ViewModel2 = viewModel2;
        ViewModel3 = viewModel3;
    }

通过这种方式,您的视图将不会意识到IoC,并且您将在viewModel中成功注入所有内容。

UPDATE2 DataTemplating将ViewsViewModels放在一起:

的App.xaml

<Application.Resources>
    <DataTemplate DataType="{x:Type local:ViewModel1}">
        <View1 />
    </DataTemplate>
</Application.Resources>