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

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

前言

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

实践

  1. 新建项目

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

    • Microsoft.Extensions.DependencyInjection
    • Microsoft.Extensions.Options.ConfigurationExtensions
    • Microsoft.Extensions.Configuration.Json

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

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

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

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

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

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

    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容器中。因此,当我们从服务提供商处获得服务时,它将自动注入所有必需的服务(如果有)。:

    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}";
            }
        }
    

  8. Demo地址:github

原文地址:https://www.cnblogs.com/lonelyxmas/p/11763767.html

时间: 2024-07-31 11:57:39

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

【WPF学习】第十一章 理解依赖项属性

依赖项属性是标准.NET属性的全新实现——具有大量新增价值.在WPF的核心特性(如动画.数据绑定以及样式)中需要嵌入依赖项属性.WPF元素提供的大多数属性都是依赖项属性.到目前位置所见到的所有示例都用到了依赖项属性,但你可能还没有意识到这一点.这是因为依赖项属性的用法和普通属性的是相同的. 然而,依赖项属性并非普通属性.可能乐意认为依赖项属性是添加了一套WPF功能的常规属性(采用典型的.NET方式进行定义).从概念上讲,依赖项属性确实以这种方式工作,但它们的背后的实现方式并非如此.原因十分简单:

.net core 3.0 Signalr - 07 业务实现-服务端 自定义管理组、用户、连接

## Hub的管理 - 重写OnConnectedAsync 从连接信息中获取UserId.Groups,ConnectId,并实现这三者的关系,存放于redis中 [代码请查看](https://github.com/xiexingen/CTS.Signalr/blob/master/CTS.Signalr.Server/Hubs/NotifyHub.cs) ``` C# using CTS.Signalr.Server.Cores; using CTS.Signalr.Server.Dtos

.Net Core 3.0依赖注入替换 Autofac

今天早上,喜庆的更新VS2019,终于3.0正式版了呀~ 有小伙伴问了一句Autofac怎么接入,因为Startup.ConfigureServices不能再把返回值改成IServiceProvider了,原来的替换依赖注入容器就不可行了,我随口说了一下Host上面.UseServiceProviderFactory 本以为就这么简单,他问我要个例子,自己折腾了一下,发现事情没有这么简单 .UseServiceProviderFactory<TContainer>要搭配Startup里面写一个

当项目中出现“未能找到与此解决方案关联的源代码管理提供程序。项目将视为不受源代码管理”

解决方法:1.vs2013打开项目, 2.提示“您正在打开的解决方案已绑定到以下Team Foundation Server上的源代码管理:http://IP:端口/tfs/defaultcollection.是否要联系此服务器以尝试启用源代码管理集成” 3.选“否N” 4.提示“解决方案看起来是受源代码管理,但无法找到他的绑定信息.由于无法自动恢复这些缺少的信息,缺少绑定的项目将被视为不受源代码管理.” 选“确定” 5.在右边的解决方案资源管理器中,在每个项目上右键>>编辑**.csproj

在ubuntu16.04中再次体验.net core 2.0

在上一篇文章中在ubuntu16.04中初次体验.net core 2.0 简单介绍了一下ubuntu中运行.net core 2.0.配置nginx反向代理以及安装supervisor守护进程--本来安装supervisor(对他不是很了解,在其他的文章中看到这么用)目的是让我们应用程序开机启动,但是现在win10 Linux子系统用不了systemctl这个命令:https://github.com/Microsoft/WSL/issues/1990 (不知道理解的对不对),之后看到微软官方

在.NET Core 3.0中发布单个Exe文件(PublishSingleFile)

假设我有一个简单的“ Hello World”控制台应用程序,我想发送给朋友来运行.朋友没有安装.NET Core,所以我知道我需要为他构建一个独立的应用程序.很简单,我只需在项目目录中运行以下命令: dotnet publish -r win-x64 -c Release --self-contained 朋友是多少位的操作系统,你就标记要发布成什么样子的, --self-contained这个标签的解释自包含,就是说你的相关依赖项与你的应用程序不挂钩,将会产生依赖,缺少一个dll就会缺胳膊少

IHostingEnvironment VS IHostEnvironment - .NET Core 3.0中的废弃类型

原文:IHostingEnvironment VS IHostEnvironment - .NET Core 3.0中的废弃类型 原文: https://andrewlock.net/ihostingenvironment-vs-ihost-environment-obsolete-types-in-net-core-3/ 作者: Andrew Lock 译者: Lamond Lu 本篇是如何升级到ASP.NET Core 3.0系列文章的第二篇. Part 1 - 将.NET Standard

译 .NET Core 3.0 发布

原文:<Announcing .NET Core 3.0> 宣布.NET Core 3.0 发布 很高兴宣布.NET Core 3.0的发布.它包括许多改进,包括添加Windows窗体和WPF,添加新的JSON API,对ARM64的支持以及全面提高的性能. C# 8 也是此发行版的一部分,其中包括可为空,异步流和更多模式.包含F#4.7,专注于放宽语法并定位.NET Standard 2.0.可以立即开始将现有项目更新为目标.NET Core 3.0.该版本与以前的版本兼容,从而使更新变得容

在WPF中使用AForge.net控制摄像头拍照

原文:在WPF中使用AForge.net控制摄像头拍照 利用AForge.net控制摄像头拍照最方便的方法就是利用PictureBox显示摄像头画面,但在WPF中不能直接使用PictureBox.必须通过<WindowsFormsHost></WindowsFormsHost>来提供交换功能.其解决方法如下: 1.按照常规方法新建一个WPF应用程序: 2.添加引用 WindowsFormsIntegration  (与WinForm交互的支持) System.Windows.For