首页 > 其他分享 >【WPF 依赖注入】WPF Ioc (Inversion of control) 控制反转 应用案例

【WPF 依赖注入】WPF Ioc (Inversion of control) 控制反转 应用案例

时间:2022-11-01 19:14:29浏览次数:52  
标签:control Inversion 作用域 App System services using WPF public

实现控制反转的前提是依赖倒置

案例项目

 

 

 

在App.xam=》App.xam.cs中配置服务

using CTMvvmDemo.MVVM.Views;
using CTMvvmDemo.MVVM.ViewsModels;
using CTMvvmDemo.Respositoies;
using Microsoft.Extensions.DependencyInjection;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Threading.Tasks;
using System.Windows;

namespace CTMvvmDemo
{
    /// <summary>
    /// Interaction logic for App.xaml
    /// </summary>
    public partial class App : Application
    {

        public App()
        {
            Services = ConfigureServices();

            this.InitializeComponent();
        }
        /// <summary>
        /// 设置应用程序的启动界面
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        void App_Startup(object sender, StartupEventArgs e)
        {
            MainWindowView window = new MainWindowView();
            window.Show();
        }

        /// <summary>
        /// Gets the current <see cref="App"/> instance in use
        /// </summary>
        public new static App Current => (App)Application.Current;

        /// <summary>
        /// Gets the <see cref="IServiceProvider"/> instance to resolve application services.
        /// </summary>
        public IServiceProvider Services { get; }

        /// <summary>
        /// Configures the services for the application.
        /// </summary>
        private static IServiceProvider ConfigureServices()
        {
            var services = new ServiceCollection();

            services.AddSingleton<IStudentRespository, StudentRespository>();
            services.AddSingleton<StudentViewsModel>();
           

            return services.BuildServiceProvider();
        }

    }
}

服务生命周期
  在Microsoft依赖项注入框架中,我们可以使用三种生命周期注册服务,分别是单例(Singleton)、瞬时(Transient)、作用域(Scoped),在上面的代码中,使用了AddSingleton()来注册服务。
  使用Singleton服务的优点是我们不会创建多个服务实例,只会创建一个实例,保存到DI容器中,直到程序退出,这不仅效率高,而且性能高,但是有一个要注意的点,如果在多线程中使用了Singleton,要考虑线程安全的问题,保证它不会有冲突
    瞬时(Transient)和单例(Singleton)模式是相反的,每次使用时,DI容器都是创建一个新的实例。
    作用域(Scoped),在一个作用域内,会使用同一个实例,像EF Core的DbContext上下文就被注册为作用域服务。

 

应用依赖注入 MainWindowViewModel.cs类中应用

    public sealed partial class MainWindowViewModel:ViewModelBase
    {
 //其他代码
    private IStudentRespository IstudentRespository;
        public MainWindowViewModel()
        {
            //依赖注入 ! 表示知道不会返回null 忽略警告 它的主要作用就是告诉编译器,变量不可能为 null
            this.IstudentRespository =  App.Current.Services.GetService<IStudentRespository>()!;
            
        }
 //其他代码
}

 

标签:control,Inversion,作用域,App,System,services,using,WPF,public
From: https://www.cnblogs.com/cdaniu/p/16848821.html

相关文章