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
{
    /// <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

 

原文链接:https://www.cnblogs.com/aierong/p/17318614.html

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:CommunityToolkit.Mvvm8.1 IOC依赖注入控制反转(5) - Python技术站

(0)
上一篇 2023年4月22日
下一篇 2023年4月22日

相关文章

  • C#编程总结(六)详解异步编程

    C#编程总结(六)详解异步编程是一篇介绍异步编程知识的教程。异步编程是C#中非常重要的概念,它可以提高应用程序的响应速度和性能。本文将详细讲解异步编程的几个主要方面。 1. 异步编程的概念和作用 异步编程是一种优化并发应用程序的方法。在C#中,异步编程可以用async和await关键字来实现。异步编程的主要作用在于减少线程的阻塞时间,提高应用程序的响应速度和…

    C# 2023年5月15日
    00
  • C#多线程之取消架构介绍

    C#多线程之取消架构介绍攻略 什么是C#多线程取消架构 在C#中,我们可以使用多线程来进行异步编程,但是在实际场景中,有时候由于各种原因,我们需要中途取消一个正在运行的线程。而为了达到这个目的,C#中引入了取消架构(Cancellation Framework),通过这个机制,我们可以实现对多线程操作的取消。在该机制中,我们创建一个CancellationT…

    C# 2023年5月15日
    00
  • Java中前台往后台传递多个id参数的实例

    下面是关于Java中前台往后台传递多个id参数的攻略及示例说明。 前言 在Java后台开发中,经常需要前台传递多个id参数的情形。这时需要采用合适的方法将多个id参数传递到后台进行处理。本文介绍了两种常用的传递多个id参数的方法。 方法一: 传递多个字符串参数 适用范围:当需要在后台获取多个string类型参数时,可以采用该方法。 前台示例代码: <f…

    C# 2023年6月1日
    00
  • ASP.NET 返回随机数实现代码

    ASP.NET 返回随机数实现代码的完整攻略如下: 1. 生成随机数 可以使用 Random 类来生成伪随机数。在 ASP.NET 中,可以使用以下代码来生成一个介于 0 到 10 之间的随机整数: Random rand = new Random(); int randomNumber = rand.Next(0, 11); 这里,我们首先创建了一个 Ra…

    C# 2023年5月31日
    00
  • c#泛型学习详解 创建线性链表

    C#泛型学习详解-创建线性链表 什么是泛型 在C#中,泛型是一种基于类型参数化的编程技术,它允许我们编写一个可以与任何类型一起工作的代码。使用泛型代码可以提高代码重用性和类型安全性。 什么是线性链表 线性链表是一种基本数据结构,由若干个数据节点构成,每个节点包含自己的数据或指向其他节点的引用。节点之间的关系是通过引用来体现的。具体的,我们可以用下列代码来表示…

    C# 2023年6月7日
    00
  • C#开发Winform程序调用存储过程

    首先我们来讲解一下C#开发Winform程序调用存储过程的攻略。 1. 连接数据库 在使用存储过程之前,我们需要先连接数据库。通常我们使用SqlClient命名空间下的SqlConnection对象来连接SQL Server数据库。 using System.Data.SqlClient; string connectionString = "Da…

    C# 2023年6月7日
    00
  • 超详细讲解Java异常

    超详细讲解Java异常 在Java编程过程中,异常处理是非常重要的一部分。异常是程序运行过程中的非期望事件,如输入数据错误、网络中断等,如果不进行处理,程序将可能会崩溃、出现严重错误,甚至导致系统崩溃。因此,Java提供了一套异常机制,使程序在遇到异常时能够进行妥善的处理,保证程序的稳定性和可靠性。 异常的分类 Java中的异常可以分为两类:Checked …

    C# 2023年5月15日
    00
  • C# DataTable数据遍历优化详解

    当处理大数据量的DataTable时,常常需要考虑优化数据遍历的性能,这里将介绍一些优化技巧来提高C#的DataTable遍历速度。 1. 使用索引来提高DataTable遍历性能 使用索引是数据检索的一种高效方式。在DataTable中使用PrimaryKey,可以基于每个列的唯一值来创建索引。通过使用PrimaryKey,可以遍历DataRow的速度被大…

    C# 2023年5月31日
    00
合作推广
合作推广
分享本页
返回顶部