将 Autofac 添加到 WPF MVVM 应用程序

2024-04-05

我似乎无法找到解决这个问题的方法。我已经看到了几个与此相关的问题,但没有一个真正给我解决方案。我对 Autofac 完全陌生,并没有真正做过太多 WPF + MVVM,但了解基础知识。

我有一个 WPF 应用程序(使用 ModernUI for WPF),我试图向其中添加 Autofac,但我很难弄清楚如何在所有视图中解析我的服务,因为它们无法访问我的容器。我有一个主视图,这是我的入口点,我在其中设置容器:

public partial class MainWindow : ModernWindow
{
    IContainer AppContainer;

    public MainWindow()
    {

        SetUpContainer();

        this.DataContext = new MainWindowViewModel();
        InitializeComponent();

        Application.Current.MainWindow = this; 
    }

    private void SetUpContainer()
    {
        var builder = new ContainerBuilder();

        BuildupContainer(builder);

        var container = builder.Build();

        AppContainer = container;
    }

    private void BuildupContainer(ContainerBuilder builder)
    {
        builder.RegisterType<Logger>().As<ILogger>();
        ...
    }
}

我遇到的问题是弄清楚如何在其他视图中解析记录器和其他服务,其中我通过 ViewModel 构造函数注入所有依赖项,如下所示:

public partial class ItemsView : UserControl
{
    private ItemsViewModel _vm;

    public ItemsView()
    {
        InitializeComponent();

        IFileHashHelper fileHashHelper = new MD5FileHashHelper();
        ILibraryLoader libraryLoader = new LibraryLoader(fileHashHelper);
        ILogger logger = new Logger();

        _vm = new ItemsViewModel(libraryLoader, logger);
        this.DataContext = _vm;
    }
}

有些视图有大量的注入参数,这就是我希望 Autofac 介入并帮助我清理问题的地方。

我正在考虑将容器传递给 ViewModel 并将其存储为 ViewModelBase 类上的属性,但我读到这将是一种反模式,即使这样我也不知道这是否会自动解析我的对象在其他 ViewModel 中。

我设法使用 Autofac 构建了一个简单的控制台应用程序

class Program
{
    static void Main(string[] args)
    {

        var builder = new ContainerBuilder();
        builder.RegisterType<Cleaner>().As<ICleaner>();
        builder.RegisterType<Repository>().AsImplementedInterfaces().InstancePerLifetimeScope();

        var container = builder.Build();

        using (var scope = container.BeginLifetimeScope())
        {

            ICleaner cleaner = container.Resolve<ICleaner>();
            cleaner.Update(stream);
        }
    }
}

但这很简单,因为它只有一个入口点。

我想要一些有关如何将 Autofac 添加到我的 WPF 应用程序的想法。我确信我做错了什么。感谢您的帮助。


扩展我上面的评论:

我在所有 WPF MVVM 应用程序中使用 Autofac,我相信它是更好的 DI 框架之一 - 这是我的观点,但我认为它是有效的。

对我来说,99% 的情况下都应该避免使用 PRISM,它是一个‘寻找问题的解决方案' 而且由于大多数人不会在 WPF 中构建动态可组合运行时解决方案,因此不需要它,我确信人们会不同意。

与任何架构模式一样,应用程序生命周期有一个设置\配置阶段,简单地说,在显示第一个视图(窗口)之前,将完成依赖注入、日志记录、异常处理、调度程序的整个设置线程管理、主题等

我有几个将 Autofac 与 WPF\MVVM 结合使用的示例,下面列出了几个,我想说看看 Simple.Wpf.Exceptions 示例:

https://github.com/oriches/Simple.Wpf.Exceptions https://github.com/oriches/Simple.Wpf.Exceptions

https://github.com/oriches/Simple.Wpf.DataGrid https://github.com/oriches/Simple.Wpf.DataGrid

https://github.com/oriches/Simple.MahApps.Template https://github.com/oriches/Simple.MahApps.Template

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 Autofac 添加到 WPF MVVM 应用程序 的相关文章

随机推荐

  • NSString:去掉 并为该段创建带有颜色的属性字符串?

    假设我有一个字符串 这是一个简单的字符串 我需要去掉 抱歉 b 和尖括号之间没有空格 由于某种原因预览没有显示它 同时将 simple 这个词加粗 我的想法是 将尖括号和 br 替换为空白 使 简单 段具有属性 问题是一旦标签被删除 我仍然
  • Eclipse Helios 不显示 Javadoc

    我最近买了一台新计算机 并在其中安装了 Eclipse Helios 之前 在我的旧计算机上 当我使用控制辅助 Ctrl 空格 并突出显示建议的方法时 该方法的 Javadoc 经常出现在控制辅助弹出窗口的一侧 其中包含方法描述和参数等 然
  • 锁定或保护 R 中的 data.table

    是否有一种或多种方法可以锁定或保护data table这样就不能再就地修改了 假设我们有一个 data table dt lt data table id 1 val foo dt id val 1 1 foo 然后我可以修改吗dt之后得到
  • Dockerfile - 中间容器到底在做什么?

    我有我的 Dockerfile 如下所示 FROM confluentinc cp kafka connect 4 0 0 ARG VERSION 0 0 2 15 RUN curl Ls https github com jcustenb
  • 在 C 编译时检查类型是结构体还是指针?

    注意 这是NOTPaul T 链接的问题的重复项 因为我问是否可以在编译时确定类型是否属于某种更广泛的不完整类型 种类 而不是在编译时是否已注册符号 这似乎是对这个问题的根本误解 我正在用 C 编写一个库 该库处理伪通用函数 该函数通过宏包
  • 水平滚动时保持树视图最左边的列可见

    我使用 ControlTemplate 和 GridViewRowPresenter 的堆栈面板在 WPF 中实现了带有列的树视图 我关注了这篇文章 http blogs msdn com b atc avalon team archive
  • 通过 Javascript 代码单击 HTML 表单的提交按钮

    我对WEB编程不太了解 所以请随时询问我是否遗漏了任何细节 有一个我经常访问的网站 它要求用户每次访问时都需要登录 对于这个网站的登录页面 我试图写下一个用户脚本 它将自动登录 我设法填写了表单字段 但不知道如何通过 JavaScript
  • 在 RESTful html 应用程序中将表单/替代视图放在哪里?

    我们假设一个 Web 应用程序为每个 URI 提供一个用于 GET 请求的漂亮 html 视图 并允许通过 POST PUT PATCH WHATEVER 更新底层资源 然后 我如何公开实际上允许从浏览器执行此类请求的各种表单 更广泛的是
  • Rails 4:.save 不会更新现有记录的updated_at?

    我一直以为 save and save 将更新updated at现有记录列 这不是真的吗 如果是这样 那么我是否需要创建一个 before save 过滤器以在每次保存时更新它 今天是 6 月 18 日 Loading developme
  • 求解具有可压缩质量守恒的一维纳维斯托克斯问题(液压阻尼器)

    I would like to solve a 1D Navier equation on a cylindrical imposed tubes cartesian cordinates 流动沿 y 方向 右室压力 p1 和左室压力 p2
  • Cordova:找不到plugin.xml

    我正在尝试从我的 coordova 文件中删除此插件 但遇到了此问题 Error Cannot find plugin xml for plugin org apache cordova file transfer Please try a
  • 超出最大调用堆栈大小。在对话框中打开

    在我的项目中 我有一个对话框 显示两个按钮 确认和取消 操作 但是 当出现这种情况时 如果我移动或单击具有与我关联的功能的按钮 则会导致此错误 未捕获的范围错误 超出最大调用堆栈大小 这是显示对话框的函数 displayConfirmMes
  • 受保护的内部类在类内工作但不在类外工作

    我尝试了一些事情 想知道为什么会这样 假设我在命名空间 n 中有一个名为 A 的类 我试图创建受保护的内部类 B namespace n public class A public A protected internal class B
  • 使用 Mockito 动态返回值

    通常在编译时定义 Mockito 模拟的返回值 即静态地 MyClass myClass Mockito mock MyClass class when myClass myMethod thenReturn 0 100 200 有没有办法
  • 查找具有其他字符串的所有字符的子字符串的最小长度的算法

    我有两个字符串 字符串1 hello how are you 字符串2 olo 包括空格字符 Output lo ho hello ho你是谁 lo ho是唯一包含 string2 的所有字符的子字符串 任何人都可以为此提出一个好的算法 我
  • 什么是 AWT-Windows 线程?

    当我使用 AWT 时 在调用Toolkit getDefaultToolkit 我已经打印了程序中当前正在运行的线程 我想知道那是什么AWT Windows在后台运行的线程 它有什么作用以及为什么有6优先事项 另外 该行 Thread AW
  • 动态句子中的单词倒序

    我有几个这样的标签 a class classCover href 1 Comment a 我想颠倒一下单词的顺序 Comments 1 我的功能是这样的 但不起作用 classCover each function this text s
  • HSQLDB / Spring 单元测试不回滚

    我正在使用 Spring 的嵌入式数据库 默认数据库是 HSQLDB 来运行一些单元测试 我的情况如下
  • 无权在 mongodb 上查询 admin.system.namespaces

    我启动一个新的 mongo 实例 创建一个用户 对其进行授权 但是当我运行 show collections 时 系统说该 id 未授权 我不知道为什么 mongo admin MongoDB shell version 2 4 3 con
  • 将 Autofac 添加到 WPF MVVM 应用程序

    我似乎无法找到解决这个问题的方法 我已经看到了几个与此相关的问题 但没有一个真正给我解决方案 我对 Autofac 完全陌生 并没有真正做过太多 WPF MVVM 但了解基础知识 我有一个 WPF 应用程序 使用 ModernUI for