在WPF中使用.NET Core 3.0依赖项注入和服务提供程序

前言

我们都知道.NET Core提供了对依赖项注入的内置支持。我们通常在ASP.NET Core中使用它(从Startup.cs文件中的ConfigureServices方法开始),但是该功能不限于此框架,我们可以在WPF和Windows Forms应用程序中使用它。

实践

  1. 新建项目#

    1572333532.jpg

  2. 将所需的NuGet包添加到项目中。#

    • Microsoft.Extensions.DependencyInjection
    • Microsoft.Extensions.Options.ConfigurationExtensions
    • Microsoft.Extensions.Configuration.Json
      1572334178_1_.jpg
  3. 然后,将一个名为appsettings.json的文件添加到项目的根文件夹。将其“ 构建操作”属性设置为“ 内容”,将“复制到输出目录”设置为“ 复制”(如果较新):#

    Copy
    { "AppSettings": { "AppName": "SampleNetCore3WpfDependencyInjection" } }
  4. 创建一个AppSettings.cs文件来保存配置设置。该文件将映射我们在appsettings.json中编写的设置:#

    Copy
    public class AppSettings { public string AppName { get; set; } }
  5. 创建一个示例服务:#

    Copy
    public interface ISampleService { Task<string> GetCurrentDate(); }
    Copy
    public class SampleService : ISampleService { public async Task<string> GetCurrentDate() => await Task.FromResult(DateTime.Now.ToLongDateString()); }

    然后像往常一样在IOC容器中注册服务:

    Copy
    services.AddScoped<ISampleService, SampleService>();
  6. 打开App.xaml文件并删除Application类的StartupUri属性。然后,我们需要重写App.xaml.cs中的OnStartup方法:#

    Copy
    public partial class App : Application { public IServiceProvider ServiceProvider { get; private set; } public IConfiguration Configuration { get; private set; } protected override void OnStartup(StartupEventArgs e) { var builder = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true); Configuration = builder.Build(); var serviceCollection = new ServiceCollection(); ConfigureServices(serviceCollection); ServiceProvider = serviceCollection.BuildServiceProvider(); var mainWindow = ServiceProvider.GetRequiredService<MainWindow>(); mainWindow.Show(); } private void ConfigureServices(IServiceCollection services) { services.Configure<AppSettings>(Configuration.GetSection(nameof(AppSettings))); services.AddScoped<ISampleService, SampleService>(); services.AddTransient(typeof(MainWindow)); } }
  7. MainWindow简单布局及代码改造#

    如上所述,MainWindow位于IOC容器中。因此,当我们从服务提供商处获得服务时,它将自动注入所有必需的服务(如果有)。:

    Copy
    public partial class MainWindow : Window { private readonly ISampleService sampleService; private readonly AppSettings settings; public MainWindow(ISampleService sampleService, IOptions<AppSettings> settings) { InitializeComponent(); this.sampleService = sampleService; this.settings = settings.Value; } private async void Button_Click(object sender, RoutedEventArgs e) { var serviceData =await sampleService.GetCurrentDate(); var settingsData = settings; TextBox1.Text = $"serviceData:{serviceData}{Environment.NewLine}settingsData:{settings.AppName}"; } }

    1572335382_1_.jpg

  8. Demo地址:github

posted @   Walter0527  阅读(3899)  评论(7编辑  收藏  举报
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示
CONTENTS