本系列文章导航

  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

CommunityToolkit.Mvvm8.1 IOC依赖注入控制反转(5)的更多相关文章

  1. Helloworld之Spring依赖注入/控制反转(DI/IoC)版

    Helloworld之Spring依赖注入/控制反转(DI/IoC)版 作者:雨水, 日期:2014-10-29 摘要:本文主要用于培训刚開始学习的人理解Spring中的依赖注入的基本概念. 先介绍依 ...

  2. C#依赖注入控制反转IOC实现详解

    原文:C#依赖注入控制反转IOC实现详解 IOC的基本概念是:不创建对象,但是描述创建它们的方式.在代码中不直接与对象和服务连接,但在配置文件中描述哪一个组件需要哪一项服务.容器负责将这些联系在一起. ...

  3. PHP关于依赖注入(控制反转)的解释和例子说明

    PHP关于依赖注入(控制反转)的解释和例子说明 发表于2年前(2014-03-20 10:12)   阅读(726) | 评论(1) 8人收藏此文章, 我要收藏 赞2 阿里云双11绽放在即 1111 ...

  4. Spring进阶之路(1)-Spring核心机制:依赖注入/控制反转

    原文地址:http://blog.csdn.net/wangyang1354/article/details/50757098 我们经常会遇到这样一种情景,就是在我们开发项目的时候经常会在一个类中调用 ...

  5. Benefits of Using the Spring Framework Dependency Injection 依赖注入 控制反转

    小结: 1. Dependency Injection is merely one concrete example of Inversion of Control. 依赖注入是仅仅是控制反转的一个具 ...

  6. laravel5.2总结--服务容器(依赖注入,控制反转)

    1.依赖 我们定义两个类:class Supperman 和 class Power,现在我们要使用Supperman ,而Supperman 依赖了Power class Supperman { p ...

  7. 依赖注入&控制反转

    IoC——Inversion of Control  控制反转DI——Dependency Injection   依赖注入 要想理解上面两个概念,就必须搞清楚如下的问题: 参与者都有谁? 依赖:谁依 ...

  8. Spring 依赖注入控制反转实现,及编码解析(自制容器)

    定义: 在运行期,由外部容器动态的将依赖对象动态地注入到组件中. 两种方式: 手工装配 -set方式 -构造器 -注解方式 自动装配(不推荐) 1利用构造器 2set方法注入 dao: package ...

  9. MVC 依赖注入/控制反转

    http://www.cnblogs.com/cnmaxu/archive/2010/10/12/1848735.html http://www.cnblogs.com/artech/archive/ ...

  10. 码农小汪-spring框架学习之2-spring IoC and Beans 控制反转 依赖注入 ApplicationContext BeanFactory

    spring Ioc依赖注入控制反转 事实上这个东西很好理解的,并非那么的复杂. 当某个Java对象,须要调用还有一个Java对象的时候(被依赖的对象)的方法时.曾经我们的做法是怎么做呢?主动的去创建 ...

随机推荐

  1. 图模导入原理之 SVG图形基础与图形导入

    一.svg图形基础 PMS图形中,图形svg文件内容一般由两部分组成: 1.<defs>标签中定义的是图元信息,即各种不同设备不同状态的图元应该如何显示: 2.各种<XXXXXX_L ...

  2. Eclipse's Content Assist

    在Eclipse里面的辅助智能索引只有"."才会提示,或者手动按alt+/补全提示.因为Eclipse的补全功能的默认设置只有".",其实你只需要稍微修改一下就 ...

  3. ubuntu16.04+win10双系统安装

    先下载Ubuntu到电脑:http://mirrors.ustc.edu.cn/ubuntu-releases/16.04.6/ubuntu-16.04.6-desktop-amd64.iso 准备个 ...

  4. 如何通过dump文件定位崩溃,解决问题

    1.dump文件是附加堆栈信息的存储文件的简称,文件扩展名".dmp",通过dump文件我们可以得到程序运行某一时刻的堆栈数据.2.当程序意外崩溃后,通常程序会立即中断运行,拿到这 ...

  5. UIPath踩坑记一开发环境检查

      第一步:设置--设计--关闭新项目使用新式体验   第二步:Uipath与浏览器的通信护展是否已安装,如果没有安装需要点击安装   第三步:浏览器中安装的扩展是否已经打开

  6. jenkins脚本

    1.统计代码 pipeline { agent any parameters { choice( description: '你需要选择当前哪个分支进行统计 ?', name: 'branchNow' ...

  7. FFT及NTT

    FFT--快速傅里叶变换(附NTT--快速数论变换) FFT是一种能在O(nlogn)时空复杂度内求解两个函数卷积的优秀算法. 算法思想(DFT): 对于函数 \(f(x)=\Sigma_{i=0}^ ...

  8. Python第五章实验报告

    一.实验项目名称:<零基础学Python>第五章实战.实例以及两道作业题 二.实验目的和要求:了解和掌握操作字符串的方法和正则表达式的应用 三.实验环境:IDLE(Python 3.9 6 ...

  9. [复现]DASCTF Sept X 浙江工业大学秋季挑战赛-PWN

    hehepwn 一开始泄露stack地址,然后写入shellcode返回到shellcode执行 from pwn import * context.os = 'linux' context.log_ ...

  10. 记录下JAVA Windows环境,WORD转PDF,用Documents4j(仅支持Windows)

    依赖: <dependency> <groupId>com.documents4j</groupId> <artifactId>documents4j- ...