WPF使用依赖注入

现在依赖注入在.Net里面已经普及,自己常写一些简单的demo倒是无所谓,但偶尔写一点正式的工程,也免不了要使用一下,于是总结了一下在WPF里面使用依赖注入。

在写简单Demo时候,通常是在MainWindow的构造函数里面直接做初始化,各种变量也都丢在MainWindow类里面。在使用依赖注入后,我发现在App里面完成一些初始化内容更合适,包括MainWindow也通过容器生成,需要注意的是,记得把App.xaml中的 StartupUri更改为 Startup,并把值改为自定义的启动函数,在启动函数里面调用MainWindow的Show方法。

App.xaml.cs

cs 复制代码
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using NLog;
using NLog.Extensions.Logging;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Net.WebSockets;
using System.Runtime.InteropServices;
using System.Threading.Tasks;
using System.Windows;

namespace TradeClient
{
    /// <summary>
    /// Interaction logic for App.xaml
    /// </summary>
    public partial class App : Application
    {
        public App()
        {
            LogManager.Configuration.Variables["ProgramName"] = System.Reflection.Assembly.GetExecutingAssembly().GetName().Name;
            LogManager.Configuration.Variables["StartTime"] = DateTime.Now.ToString("yyyyMMdd-HHmmss");

            var config = new ConfigurationBuilder().Build();
            var servicesCollection = new ServiceCollection();
            servicesCollection.AddLogging(loggingBuilder => loggingBuilder.AddNLog(config));
            servicesCollection.AddSingleton<ApiDatas>();
            servicesCollection.AddSingleton<TradeSpiImpl>();
            servicesCollection.AddSingleton<TradeSpiMiddle>();
            servicesCollection.AddSingleton<MainWindow>();
            ServiceProvider = servicesCollection.BuildServiceProvider();

            TradeSpiMiddle tradeSpiMiddle = ServiceProvider.GetRequiredService<TradeSpiMiddle>();
            tradeSpiMiddle.InitTradeSpi(ref TradeSpi);
            int size = Marshal.SizeOf(TradeSpi);
            TradeSpiPoint = Marshal.AllocHGlobal(size);
            Marshal.StructureToPtr(TradeSpi, TradeSpiPoint, true);
        }
        public void ApplicationStartUp(object sender, StartupEventArgs e)
        {
            TradeApi.CreateTradeApi();
            TradeApi.RegisterSpi(TradeSpiPoint);
            TradeApi.RegisterFront("127.0.0.1", 10001);
            TradeApi.Init();

            MainWindow mainWindow = ServiceProvider.GetRequiredService<MainWindow>();
            mainWindow.Show();
        }



        private TradeSpi TradeSpi = new();
        private IntPtr TradeSpiPoint;
        private ServiceProvider ServiceProvider;
    }
}
相关推荐
偶尔的鼠标人9 小时前
Avalonia/WPF 打开子窗口,并且跨页面传值
c#·wpf·mvvm·avalonia
玖笙&9 小时前
✨WPF编程进阶【6.1】:图形原则(附源码)
c++·c#·wpf·visual studio
lixy57910 小时前
WPF检测网络状态切换
wpf
纸照片10 小时前
WPF中为Button设置IsMouseOver和IsPressed事件中改变背景颜色不起作用
c#·.net·wpf
Aevget10 小时前
DevExpress WPF中文教程:Data Grid - 如何使用虚拟源?(四)
ui·.net·wpf·devexpress·wpf控件
Z_W_H_11 小时前
【ArcGISProSDK】刷新按钮样式
wpf·arcgisprosdk
rollingman15 小时前
WPF ListView 列表
wpf
Hare_bai2 天前
WPF的MVVM模式核心架构与实现细节
ui·架构·c#·wpf·交互·xaml·mvvm
张人玉2 天前
WPF 静态样式与动态样式的定义及使用详解
ui·c#·wpf
山间点烟雨2 天前
2. WPF程序打包成一个单独的exe文件
c#·wpf·独立打包exe