WPF 中引入依赖注入(.NET 通用主机)

在网上看到的文章都是通过 App.cs 中修改配置进行的,这样侵入性很高而且服务主机是通过 App 启动时加载的而不是服务主机加载的 App 有一点违反原则。目前,借助 C# 9.0 带来的顶层语句可以轻松解决这个问题。

方案

  1. 在 nuget 中安装 Microsoft.Extensions.Hosting
  2. 在根目录新建 Program.cs,改为下面的代码
using TestProgram;
using TestProgram.Common;
// 使用 .NET 依赖注入库
using Microsoft.Extensions.DependencyInjection;
// 使用 .NET 通用主机
using Microsoft.Extensions.Hosting;
using System.Threading; // 窗口化应用需要在 STA 模式下运行,设置当前
if (!Thread.CurrentThread.TrySetApartmentState(ApartmentState.STA))
{
Thread.CurrentThread.SetApartmentState(ApartmentState.Unknown);
Thread.CurrentThread.SetApartmentState(ApartmentState.STA);
}
// 构建默认主机
var builder = Host.CreateDefaultBuilder();
// 配置
await builder.ConfigureServices(services =>
{
services.AddLogging();
// 注入 ViewModel(自行实现非官方)
services.AddViewModels();
// 注入 View(自行实现非官方)
services.AddViews();
// 注入 WPF 启动类 App
services.AddSingleton<App>();
// 启动 WPF 服务
services.AddHostedService<WPFRunner<App, MainWindow>>();
}).Build().RunAsync();
  1. 编写 WPFRunner 用于启动 WPF 服务,在适合的命名空间中新建一个 WPFRunner.cs 文件,插入下面的代码
using Microsoft.Extensions.Hosting;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks; namespace TestProgram.Common
{
public class WPFRunner<TApplication, TWindow> : IHostedService where TApplication : System.Windows.Application where TWindow : System.Windows.Window
{
private readonly TApplication application;
private readonly TWindow window;
public WPFRunner(TWindow window, TApplication application)
{
this.window = window;
this.application = application;
}
// 参考 ASP.NET 中的后台服务(见下方参考)
public Task StartAsync(CancellationToken cancellationToken)
{
// 启动
application.Run(window);
return Task.CompletedTask;
} public Task StopAsync(CancellationToken cancellationToken)
{
// 结束
application.Shutdown();
return Task.CompletedTask;
}
}
}

参考

  1. .NET 通用主机
  2. 顶级语句 - 不使用 Main 方法的程序
  3. IHostedService 接口

WPF 中引入依赖注入(.NET 通用主机)的更多相关文章

  1. 在WPF中使用依赖注入的方式创建视图

    在WPF中使用依赖注入的方式创建视图 0x00 问题的产生 互联网时代桌面开发真是越来越少了,很多应用都转到了浏览器端和移动智能终端,相应的软件开发上的新技术应用到桌面开发的文章也很少.我之前主要做W ...

  2. dotnetcore3.1 WPF 中使用依赖注入

    dotnetcore3.1 WPF 中使用依赖注入 Intro 在 ASP.NET Core 中默认就已经集成了依赖注入,最近把 DbTool 迁移到了 WPF dotnetcore 3.1, 在 W ...

  3. Asp.net core中的依赖注入

    使用服务 在Asp.net core的Controller中,可以通过如下两种方式获取系统注入的服务: 构造函数 可以直接在构造函数中传入所依赖的服务,这是非常常见的DI注入方式. public Va ...

  4. 在 XUnit 中使用依赖注入

    在 XUnit 中使用依赖注入 Intro 之前写过一篇 xunit 的依赖注入相关的文章,但是实际使用起来不是那么方便 今天介绍一个基于xunit和微软依赖注入框架的"真正"的依 ...

  5. 在 xunit 测试项目中使用依赖注入

    在 xunit 测试项目中使用依赖注入 Intro 之前写过几篇 xunit 依赖注入的文章,今天这篇文章将结合我在 .NET Conf 上的分享,更加系统的分享一下在测试中的应用案例. 之所以想分享 ...

  6. ASP.NET Core中的依赖注入(2):依赖注入(DI)

    IoC主要体现了这样一种设计思想:通过将一组通用流程的控制从应用转移到框架之中以实现对流程的复用,同时采用"好莱坞原则"是应用程序以被动的方式实现对流程的定制.我们可以采用若干设计 ...

  7. NET Core 中的依赖注入

    NET Core 中的依赖注入 [共7篇] 一.控制反转(IoC) ASP.NET Core在启动以及后续针对每个请求的处理过程中的各个环节都需要相应的组件提供相应的服务,为了方便对这些组件进行定制, ...

  8. JavaEE开发之Spring中的依赖注入与AOP

    上篇博客我们系统的聊了<JavaEE开发之基于Eclipse的环境搭建以及Maven Web App的创建>,并在之前的博客中我们聊了依赖注入的相关东西,并且使用Objective-C的R ...

  9. JavaEE开发之Spring中的依赖注入与AOP编程

    上篇博客我们系统的聊了<JavaEE开发之基于Eclipse的环境搭建以及Maven Web App的创建>,并在之前的博客中我们聊了依赖注入的相关东西,并且使用Objective-C的R ...

  10. Android 和 Dagger 2 中的依赖注入

    原文:Dependency Injection in Android with Dagger 2 作者:Joe Howard 译者:kmyhy 在现代开发团队中到处充斥着"你一定要用依赖注入 ...

随机推荐

  1. 使用CosmosDB进行大规模数据的实时数据处理和流式传输

    目录 使用 Cosmos DB 进行大规模数据的实时数据处理和流式传输 背景介绍 文章目的 目标受众 技术原理及概念 基本概念解释 技术原理介绍 相关技术比较 实现步骤与流程 准备工作:环境配置与依赖 ...

  2. 大数据实战手册-开发篇之IO

    2.4 sparkContext IO:读 2.4.1 textFile # Load a text file and convert each line to a Row. lines = sc.t ...

  3. Linux网络设备命名规则简介

    Linux网络设备命名规则简介 几年前, Linux内核为网络接口分配名称采用的是一种简单和直观的方式:一个固定的前缀和一个递增的序号.比如,内核使用eth0名称以标识启动后第一个加载的网络设备,第二 ...

  4. 跨越HTTP无状态边界:Cookie与Session在Django中的实战应用

    本文深入探索了Django中的Cookie和Session,解析了如何应对HTTP协议的无状态性问题,说明其基础概念,分析工作原理,并讨论何时应选择使用Cookie或Session.文章进阶部分,提出 ...

  5. windows ce 5.0 + vs2005 + sql数据库_开发注意事项

    今天通过对RFID读写器(windows ce 5.0)的摸索以及实验总结出一下注意事项: 安装 vs2005 后要配置windows ce 的开发环境,从网上下载对应设备版本的SDK,安装后新建项目 ...

  6. Starting Tomcat v8.0 Server at localhost has encountered a problem.

    现有Tomcat文件夹配置有问题,安装新的tomcat从新启动就好了

  7. MapReduce实现TopN的效果

    1.背景 最近在学习Hadoop的MapReduce,此处记录一下如何实现 TopN 的效果,以及在MapReduce中如何实现 自定义分组. 2.需求 我们有一份数据,数据中存在如下3个字段,订单编 ...

  8. Dubbo的高级特性:服务管控篇

    王有志,一个分享硬核Java技术的互金摸鱼侠 加入Java人的提桶跑路群:共同富裕的Java人 上一篇,我们已经介绍了 DUbbo 在服务治理方面提供的特性,今天我们一起来看看 Dubbo 在其它方面 ...

  9. Unity UGUI的VerticalLayoutGroup(垂直布局)组件的介绍及使用

    Unity UGUI的VerticalLayoutGroup(垂直布局)组件的介绍及使用 1. 什么是VerticalLayoutGroup组件? VerticalLayoutGroup是Unity ...

  10. Unity的IPostprocessBuild:深入解析与实用案例

    Unity IPostprocessBuild技术文章 Unity IPostprocessBuild是Unity引擎中的一个非常有用的功能,它可以让开发者在构建项目后自动执行一些操作.这个功能可以帮 ...