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


     

    本系列文章导航
    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
    {
    ///
    /// Gets the current instance in use
    ///
    public new static App Current => ( App ) Application.Current;
    ///
    /// Gets the instance to resolve application services.
    ///
    public IServiceProvider Services
    {
    get;
    }
    public App ()
    {
    Services = ConfigureServices();
    this.InitializeComponent();
    }
    private static IServiceProvider ConfigureServices ()
    {
    var services = new ServiceCollection();
    // 注册Services
    services.AddSingleton();
    services.AddSingleton();
    //services.AddSingleton();
    // 注册Viewmodels
    // 不是每个Viewmodels都得来AddTransient,如果Viewmodels不需要ioc,可以不用这里注册
    services.AddTransient();
    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();
    //代码任何处,都可以使用App.Current.Services.GetService获取到服务
    //IFilesService filesService = App.Current.Services.GetService();
    }
    }

     

    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();
    //代码任何处,都可以使用App.Current.Services.GetService获取到服务
    IFilesService filesService = App.Current.Services.GetService();

     

     

     

     

    自我Demo地址:

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

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    1

     

  • 相关阅读:
    Golang时间
    [FMMPEG] parse与 demuxer
    wait函数与waitpid函数的区别
    【C++】二叉搜索树
    大学生游戏静态HTML网页设计 (HTML+CSS+JS仿英雄联盟网站15页)
    7. 用Rust手把手编写一个wmproxy(代理,内网穿透等), HTTP及TCP内网穿透原理及运行篇
    SpringMVC实训内容
    P1952 火星上的加法运算
    Python基础 P6函数
    观察者模式用途总结
  • 原文地址:https://www.cnblogs.com/aierong/p/17318614.html