c# - 在 MVVM 应用程序中使用 autofac

标签 c# wpf xaml mvvm autofac

点击加载应用程序设置的用户按钮后,我的应用程序将进入中断模式。我已在 Bootstrap 类中注册了该组件。

如何在引导类中注册用户 Controller 的构造函数以避免中断?

public class Bootstrapper
{
    public IContainer Bootstrap()
    {
        var builder = new ContainerBuilder();

        builder.RegisterType<LoginView>().AsSelf();
        builder.RegisterType<SchoolSectionDataService>().As<ISchoolSectionDataService>();
        builder.RegisterType<AdminView>().AsSelf();

        builder.RegisterType<School>().AsSelf();
        builder.RegisterType<MainSchoolSetupViewModel>().AsSelf();

        return builder.Build();
    }
}

用户控件是:

private MainSchoolSetupViewModel _viewModel;

public School(MainSchoolSetupViewModel schoolSetupViewModel)
{
    InitializeComponent();
    _viewModel = schoolSetupViewModel;
    DataContext = _viewModel;
    Loaded += UserControl_Loaded;
}

private void UserControl_Loaded(object sender, RoutedEventArgs e)
{
    _viewModel.Load();
}

最佳答案

不幸的是,将 View 模型传递到用户控件的构造函数中是不可能的,但解决它的方法很少。通常最重要的是,在结合 DI 和 XAML 和 MVVM 进行构建时,只有 View 模型会注册到容器中。

评论中提到了几个选项:

  1. 在 Bootstrap 中添加静态 IContainer 属性。在用户控件的构造函数中调用它来获取 VM:

    public School()
    {
        InitializeComponent();
        _viewModel = Bootstrap.Container.Resolve<MainSchoolSetupViewModel>();
        ...
    
  2. 跳过 DI,而是在 XAML 中创建 View 模型实例:
<UserControl.DataContext>
   <local:SchoolViewModel/>
</UserControl.DataContext>

但您很可能希望还有其他可能性:

  • 使用 ViewModelLocator 来帮助进行 DI。这个答案中有详细记录:https://stackoverflow.com/a/25524753/66988
  • 主要思想是创建一个新的 ViewModelLocator 类:

    class ViewModelLocator
    {
        public SchoolViewModel SchoolViewModel
        {
            get { return Bootstrap.Container.Resolve<SchoolViewModel>(); } 
        }
    }
    

    并在 App.xaml 中创建它的静态实例,并使用它来创建用户控件的数据上下文:

    DataContext="{Binding SchoolViewModel, Source={StaticResource ViewModelLocator}}">
    

    对于其他解决方案,一种选择是查看某些 MVVM 框架的源代码,例如 Caliburn.Micro 。从 Caliburn.Micro 您可以找到您可能感兴趣的 ViewModelLocator 和 ViewLocator。

    关于c# - 在 MVVM 应用程序中使用 autofac,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49032232/

    相关文章:

    c# - 在 Visual Studio XML 文档中同时使用 <value> 和 <summary> 标签的目的

    c# - 如何在 WPF 中禁用调整 UserControl 的大小

    c# - 数据网格到 Excel?

    c# - 选择器标题颜色不可更改

    xaml - UWP (Windows 10) XAML 中的 WebBrowser 控件

    c# - 有什么方法可以知道插件是否引发了 MS CRM 异常?

    c# - ASP .NET 单例

    c# - NAudio播放位置

    c# - WPF 剪贴板操作期间的数据丢失

    wpf - 从 WPF 中的 ViewModel 类(MVVM 模式)更新 UI