CommunityToolkit.Mvvm8.1 IOC依赖注入控制反转(5)

  • CommunityToolkit.Mvvm8.1 IOC依赖注入控制反转(5)已关闭评论
  • 148 次浏览
  • A+
所属分类:.NET技术
摘要

   CommunityToolkit.Mvvm包不提供ioc功能,但是官方建议使用:Microsoft.Extensions.DependencyInjection使用IOC

 

本系列文章导航
  1. https://www.cnblogs.com/aierong/p/17300066.html
  2. https://github.com/aierong/WpfDemo (自我Demo地址)

希望提到的知识对您有所提示,同时欢迎交流和指正
作者:aierong
出处:https://www.cnblogs.com/aierong

 

 

说明

CommunityToolkit.Mvvm包不提供ioc功能,但是官方建议使用:Microsoft.Extensions.DependencyInjection使用IOC

 

安装

nuget:Microsoft.Extensions.DependencyInjection 包

 

接口和服务的定义实现

public interface IBill {     bool IsExistId ( string name );      string GetData ( string name ); }
public class BillService : IBill {     public string GetData ( string name )     {         return string.Format( "name:{0}" , name );     }      public bool IsExistId ( string name )     {         return name == "qq";     } }

 

App.xaml.cs注册

public partial class App : Application {     /// <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;     }      public App ()     {         Services = ConfigureServices();          this.InitializeComponent();     }      private static IServiceProvider ConfigureServices ()     {         var services = new ServiceCollection();          //   注册Services         services.AddSingleton<IOCDemo.Service.Repository.IBill , IOCDemo.Service.Repository.BillService>();         services.AddSingleton<IOCDemo.Service.Service.IBill , IOCDemo.Service.Service.BillService>();         //services.AddSingleton<ISettingsService , SettingsService>();           //  注册Viewmodels         // 不是每个Viewmodels都得来AddTransient,如果Viewmodels不需要ioc,可以不用这里注册         services.AddTransient<IOCDemo.ViewModels.WindowViewModel1>();          return services.BuildServiceProvider();     } }

 

view中使用

原有的view与viewmodel的绑定方式改变如下:

public partial class Window1 : Window {     public Window1 ()     {         InitializeComponent();          // this.DataContext = new WindowViewModel1(); 这样不可以使用了,请用App.Current.Services.GetService         this.DataContext = App.Current.Services.GetService<WindowViewModel1>();            //代码任何处,都可以使用App.Current.Services.GetService获取到服务         //IFilesService filesService = App.Current.Services.GetService<IFilesService>();     } }

 

viewmodel中使用

vm的构造函数中注入服务即可

readonly Service.Service.IBill _IBill;  public WindowViewModel1 ( Service.Service.IBill iBill ) {     this._IBill = iBill; }  [RelayCommand( CanExecute = nameof( CanButton ) )] void ButtonClick () {     //点击按钮,修改标题      if ( this._IBill.IsExistId( Title ) )     {         Title = "qq" + this._IBill.GetData( Title );     }     else     {         Title = "qq";     } }

 

 

代码中获取服务的方式

this.DataContext = App.Current.Services.GetService<WindowViewModel1>();  //代码任何处,都可以使用App.Current.Services.GetService获取到服务 IFilesService filesService = App.Current.Services.GetService<IFilesService>();

 

 

 

 

自我Demo地址:

https://github.com/aierong/WpfDemo/tree/main/WpfDemoNet6/IOCDemo

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1