WPF使用依赖注入

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

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

App.xaml.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;
    }
}

在Windows Presentation Foundation (WPF) 中,依赖注入(Dependency Injection,简称DI)是一种设计模式,用于管理应用程序中组件之间的交互和依赖关系。它的核心思想是让组件自身声明需要的依赖项,而不是直接创建它们。这样做的优点包括: 1. **解耦**:每个组件只关注其职责,而不关心如何获取所需的其他组件,降低了代码之间的耦合度,使得组件更易于测试和维护。 2. **灵活性**:通过依赖注入框架(如Unity、MvvmLight等),开发者可以在运行时动态改变组件的依赖关系,提供更好的灵活性。 3. **配置独立**:依赖关系可以从代码转移到外部配置文件,甚至是容器本身,使得部署和调整应用变得更加容易。 在WPF中,你可以使用`Microsoft Prism`、`AutoFac` 或 `SimpleInjector` 等流行库实现依赖注入。以下是一个简单的例子: ```csharp // 定义一个依赖接口 public interface IMyService { void DoSomething(); } // 实现该接口的服务 public class MyService : IMyService { public void DoSomething() { /* ... */ } } // UI界面中,通过构造函数注入服务 public partial class MainWindow : Window { private readonly IMyService _myService; public MainWindow(IMyService myService) { InitializeComponent(); _myService = myService; } // 在适当的地方使用服务 private void Button_Click(object sender, RoutedEventArgs e) { _myService.DoSomething(); } } ``` 在这个例子中,`MainWindow` 类通过构造函数接收了 `IMyService` 的实例,实现了依赖注入。这使得`MyService` 可以在不更改`MainWindow` 类的情况下被替换,从而提高代码的复用性和可测试性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值