首页 > 编程语言 >C# .NET6 WPF 依赖注入

C# .NET6 WPF 依赖注入

时间:2023-08-16 14:13:50浏览次数:33  
标签:C# ServiceProvider 添加 static using services NET6 WPF public

入口文件: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)
        {

        }
    }
}
View Code

全局服务帮助类: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>();
        }
    }
}
View Code

添加自定义接口和服务的类: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;
        }
    }
}
View Code

 

翻译

搜索

复制

标签:C#,ServiceProvider,添加,static,using,services,NET6,WPF,public
From: https://www.cnblogs.com/smartnn/p/17633848.html

相关文章

  • teamcenter rac 开发 卡死 问题 导出excel 文件时
    解决方法:我对比了,芬尼的这个功能,发现那边在tc配置了查看器的属性,首航这边没配置,然后芬妮没有这个bug,代码也是相同的,所以我交实施配置了查看器的属性就可以了 ......
  • BLE中PHY层的LE Coded技术
    BLE中PHY层的LECoded技术介绍​ 在BLE的PHY中,提及到了调制技术中有一个叫LECoded的技术,还提到了一个S参数。这里我们来介绍下这个LECoded技术是什么东西。基本原理​ LECode技术本质上是一个扩频技术,他的原理为通过一个扩展因子S,对原始数据进行扩展。什么意思呢?我们通过......
  • teamcenter 无法加载或刷新对象。请参考错误堆栈中之前的......“写访问被拒绝”
     原因:改用户没有对该item的修改权限。尝试去对属性修改时报错解释方法:1、系统管理员开旁路2、在代码里开超级权限/** *超级权限设置属性值 *@paramsession *@paramcomponent *@paramPropertyName *@parampropertyValue *@return */ publicbooleansetProp......
  • 红帽RHCE考题总结练习(8.0 ansible)
    本文是红帽RHCE考题的总结,个别题目写了多种步骤。一、安装和配置ansible题目:按照下方所述,在控制节点bastion.lab.example.com上安装和配置Ansible:安装所需的软件包创建名为/home/devops/ansible/inventory的静态清单文件,以满足以下要求:servera是dev主机组的成员s......
  • pycharm安装(windows10)
    下载地址https://www.jetbrains.com/pycharm/ 下载后,选择合适的路径安装,选项如下 默认JetBrains进行安装 安装后,重启电脑(后期手动重启也可) 重启后,激活PyCharm。双击PyCharm桌面软件PyCharm激活和插件(Plugins,CodeWithMe)激活。选择PyCharm的Activationcode激......
  • teamcenter awc 开发-柱状图、饼状图修改颜色
    1、在对应的chartProviders下面添加"chartColorOverrideClass":"hf_aw-charts-chartColor"2、在src下创建一个scss文件@import'mixins/mixins';.hf_aw-charts-chartColor1{   background-color:#426ab3;}.hf_aw-charts-chartColor2{   backgroun......
  • C++类对象的创建方式
    1、默认构造函数创建类对象在C++中,当我们定义一个类时,如果没有明确地为类编写构造函数,编译器会为我们提供一个默认的构造函数。这就是我们所说的默认构造函数。默认构造函数没有任何参数,但是它会执行一些基本的任务,比如为类中的成员变量分配内存。2、拷贝构造函数创建类对象拷......
  • rockchip平台关闭硬件加速 vendor.hwc.compose_policy
    修改位置:device/rockchip/rk356x/device.mk:114:        vendor.hwc.compose_policy=1\这个值是在/hardware/rockchip/hwcomposer/drmhwc2/rockchip/platform/rk3588/drmvop3588.cpp:2923:intiMode=hwc_get_int_property("vendor.hwc.compose_policy",&qu......
  • teamcenter soa 服务报错:The server returned an internal server。操作执行期间,与Te
     原因:这个是代码有一个空指针,去加载属性所以报这个错误 这一段代码,框起来的就是空......
  • docker命令学习
    docker镜像命令:                      退出:exit           退出但是不停止运行:Ctrl+p+q 删除容器:rm容器iddockerimages  查看镜像dockersearch 镜像名称 ......