c# - 在 WPF 中使用 Unity

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

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

我的问题是关于最佳实践。

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

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

  1. 太多了(这是一个大项目)
  2. 用户控件通过xaml添加
  3. 有几个非常松散 项目中的相关“模块” 可以共享同一个容器 配置。

我宁愿不从每个需要访问容器的对象中的配置文件重新创建容器。

当需要同一容器作为同一程序集的各种“模块”中的服务时,有什么最佳实践建议吗?

谢谢。

最佳答案

我相信将 ControlsIoC 放在一起是痛苦的……至少在代码中是这样。可能有人会争论,但 IMO 避免这种痛苦的最佳实践是 MVVM。您将拥有可以使用 Unity 自由构建的 View 模型,并将您需要的一切注入(inject)其中。您将拥有与 viewModels 绑定(bind)的 View ,而没有理由知道任何控制反转。

更新:基于评论:

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();
    }

外壳 XAML 示例:

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

主视图模型:

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;
    }

通过这种方式,您的 View 将不知道 IoC,并且您在 viewModels 中想要的一切都将被成功注入(inject)。

UPDATE2 DataTemplating 将 ViewsViewModels 结合在一起:

应用.xaml

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

关于c# - 在 WPF 中使用 Unity,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5158970/

相关文章:

c# - Double 数据类型,计算小数点后的小数位数

c# - WPF 中的快速二维图形

WPF TextBox MenuItem 移动鼠标时失去焦点

c# - 单元测试 unityContainer.Resolve

asp.net - 依赖注入(inject)到 AuthorizationFilterAttribute

c# - 确定异常是否可重新抛出

c# - 如何等待语音合成完成

c# - 带有 CheckBox 的 WPF ListView 选择问题

c# - Unity [Depedency] Annotation 本身不是一个依赖吗?

c# - 如何查看我的(c# 实现的)POST 发送的信息?