实现控制反转的前提是依赖倒置
案例项目
在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