C# .NET6 WPF 依赖注入
入口文件:App.xaml.cs

using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Serilog; using System; using System.IO; using System.Text; using System.Windows; namespace Demo { /// <summary> /// Interaction logic for App.xaml /// </summary> public partial class App : Application { /// <summary> /// 构造函数 /// </summary> public App() { // 创建服务容器 var services = new ServiceCollection(); // 添加服务注册 ConfigureServices(services); // 构建ServiceProvider对象 ServiceProviderHelper.InitServiceProvider(services.BuildServiceProvider()); // 注册编码格式 Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); } /// <summary> /// 配置服务 /// </summary> /// <param name="services"></param> private static void ConfigureServices(IServiceCollection services) { // 添加配置文件 IConfigurationBuilder configurationBuilder = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("appsettings.json") .AddJsonFile($"appsettings.{Environment.GetEnvironmentVariable("DOTNET_ENVIRONMENT")}.json", optional: true, reloadOnChange: false); IConfiguration configuration = configurationBuilder.Build(); services.AddSingleton(configuration); // 添加Logger services.AddLogging(builder => { // 创建Serilog实例 var serilogLogger = new LoggerConfiguration() .ReadFrom.Configuration(configuration) .Enrich.FromLogContext() .CreateLogger(); // 添加Serilog builder.AddSerilog(logger: serilogLogger, dispose: true); }); // 添加数据库上下文 services.AddDbContext<SqliteContext>(options => options.UseSqlite(configuration["ConnectionStrings:SQLite"])); // 添加自定义接口和服务 services.AddAppServices(); } /// <summary> /// 程序启动 /// </summary> /// <param name="e"></param> protected override void OnStartup(StartupEventArgs e) { // 获取启动窗口 var window = ServiceProviderHelper.GetWindow<MainWindow>(); window.Show(); } /// <summary> /// 程序退出 /// </summary> /// <param name="e"></param> protected override void OnExit(ExitEventArgs e) { } } }
全局服务帮助类:ServiceProviderHelper.cs

using Microsoft.Extensions.DependencyInjection; using System; using System.Windows; namespace Demo { /// <summary> /// 全局服务帮助类 /// </summary> public static class ServiceProviderHelper { /// <summary> /// 全局服务提供者 /// </summary> public static IServiceProvider ServiceProvider { get; private set; } = null!; /// <summary> /// 初始化构建ServiceProvider对象 /// </summary> /// <param name="serviceProvider"></param> /// <exception cref="ArgumentNullException"></exception> public static void InitServiceProvider(ServiceProvider serviceProvider) { ArgumentNullException.ThrowIfNull(serviceProvider, nameof(serviceProvider)); ServiceProvider = serviceProvider; } /// <summary> /// 获取Window窗口 /// </summary> /// <param name="type"></param> /// <returns></returns> /// <exception cref="ArgumentException"></exception> public static T GetWindow<T>() where T : Window { var service = ServiceProvider.GetRequiredService<T>(); if (service != null && service is Window) { return service; } else { throw new ArgumentException($"{typeof(T).FullName} is not a Window"); } } /// <summary> /// 获取服务 /// </summary> /// <param name="type"></param> /// <returns></returns> /// <exception cref="ArgumentException"></exception> public static T GetService<T>() where T : notnull { return ServiceProvider.GetRequiredService<T>(); } } }
添加自定义接口和服务的类:AppServices.cs

using Microsoft.Extensions.DependencyInjection; namespace Demo { /// <summary> /// 添加自定义接口和服务的类 /// </summary> public static class AppServices { /// <summary> /// 添加自定义接口和服务 /// </summary> /// <param name="services"></param> /// <returns></returns> public static IServiceCollection AddAppServices(this IServiceCollection services) { // 接口 services.AddTransient<ISqliteService, SqliteService>(); // 类 services.AddScoped(typeof(Manage)); // 窗口 services.AddSingleton(typeof(MainWindow)); services.AddTransient(typeof(BaseWindow)); // 返回 return services; } } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!