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;
    }
}
相关推荐
晓纪同学12 小时前
WPF-09 命令系统
wpf
晓纪同学13 小时前
WPF-10资源系统
wpf
七夜zippoe19 小时前
DolphinDB集群部署:从单机到分布式
分布式·wpf·单机·dolphindb·分集群
波波0072 天前
写出稳定C#系统的关键:不可变性思想解析
开发语言·c#·wpf
bugcome_com2 天前
从 MVVMLight 到 CommunityToolkit.Mvvm:MVVM 框架的现代化演进与全面对比
wpf
笺上知微2 天前
基于HelixToolkit.SharpDX 渲染3D模型
wpf
晓纪同学3 天前
WPF-03 第一个WPF程序
大数据·hadoop·wpf
光电大美美-见合八方中国芯3 天前
用于无色波分复用光网络的 10.7 Gb/s 反射式电吸收调制器与半导体光放大器单片集成
网络·后端·ai·云计算·wpf·信息与通信·模块测试
晓纪同学3 天前
WPF-02体系结构
wpf
晓纪同学4 天前
WPF-01概述
wpf