gpt4 book ai didi

c# - 在 WPF 中使用 Unity

转载 作者:行者123 更新时间:2023-11-30 15:45:29 24 4
gpt4 key购买 nike

我让 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com