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;
    }
}
相关推荐
没有bug.的程序员1 天前
SOA、微服务、分布式系统的区别与联系
java·jvm·微服务·架构·wpf·日志·gc
Macbethad1 天前
基于WPF的半导体设备配方管理程序技术方案
wpf
FuckPatience1 天前
WPF Geometry
wpf
武藤一雄2 天前
.NET 中常见计时器大全
microsoft·微软·c#·.net·wpf·.netcore
MarkHD2 天前
车辆TBOX科普 第70次 AUTOSAR Adaptive、容器化与云原生的融合革命
云原生·wpf
极客智造2 天前
WPF Behavior 实战:自定义 InvokeCommandAction 实现事件与命令解耦
wpf
L、2182 天前
Flutter 与 OpenHarmony 深度集成:构建分布式多端协同应用
分布式·flutter·wpf
布伦鸽2 天前
C# WPF -MaterialDesignTheme 找不到资源“xxx“问题记录
开发语言·c#·wpf
小二·3 天前
MyBatis基础入门《十五》分布式事务实战:Seata + MyBatis 实现跨服务数据一致性
分布式·wpf·mybatis
helloworddm3 天前
UnregisterManyAsync
wpf