翼度科技»论坛 编程开发 .net 查看内容

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

9

主题

9

帖子

27

积分

新手上路

Rank: 1

积分
27
 
本系列文章导航

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

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

nuget:Microsoft.Extensions.DependencyInjection 包
 
接口和服务的定义实现
  1. public interface IBill
  2. {
  3.     bool IsExistId ( string name );
  4.     string GetData ( string name );
  5. }
复制代码
  1. public class BillService : IBill
  2. {
  3.     public string GetData ( string name )
  4.     {
  5.         return string.Format( "name:{0}" , name );
  6.     }
  7.     public bool IsExistId ( string name )
  8.     {
  9.         return name == "qq";
  10.     }
  11. }
复制代码
 
App.xaml.cs注册
  1. public partial class App : Application
  2. {
  3.     /// <summary>
  4.     /// Gets the current <see cref="App"/> instance in use
  5.     /// </summary>
  6.     public new static App Current => ( App ) Application.Current;
  7.     /// <summary>
  8.     /// Gets the <see cref="IServiceProvider"/> instance to resolve application services.
  9.     /// </summary>
  10.     public IServiceProvider Services
  11.     {
  12.         get;
  13.     }
  14.     public App ()
  15.     {
  16.         Services = ConfigureServices();
  17.         this.InitializeComponent();
  18.     }
  19.     private static IServiceProvider ConfigureServices ()
  20.     {
  21.         var services = new ServiceCollection();
  22.         //   注册Services
  23.         services.AddSingleton<IOCDemo.Service.Repository.IBill , IOCDemo.Service.Repository.BillService>();
  24.         services.AddSingleton<IOCDemo.Service.Service.IBill , IOCDemo.Service.Service.BillService>();
  25.         //services.AddSingleton<ISettingsService , SettingsService>();
  26.         //  注册Viewmodels
  27.         // 不是每个Viewmodels都得来AddTransient,如果Viewmodels不需要ioc,可以不用这里注册
  28.         services.AddTransient<IOCDemo.ViewModels.WindowViewModel1>();
  29.         return services.BuildServiceProvider();
  30.     }
  31. }
复制代码
 
view中使用

原有的view与viewmodel的绑定方式改变如下:
  1. public partial class Window1 : Window
  2. {
  3.     public Window1 ()
  4.     {
  5.         InitializeComponent();
  6.         // this.DataContext = new WindowViewModel1(); 这样不可以使用了,请用App.Current.Services.GetService
  7.         this.DataContext = App.Current.Services.GetService<WindowViewModel1>();  
  8.         //代码任何处,都可以使用App.Current.Services.GetService获取到服务
  9.         //IFilesService filesService = App.Current.Services.GetService<IFilesService>();
  10.     }
  11. }
复制代码
 
viewmodel中使用

vm的构造函数中注入服务即可
  1. readonly Service.Service.IBill _IBill;
  2. public WindowViewModel1 ( Service.Service.IBill iBill )
  3. {
  4.     this._IBill = iBill;
  5. }
  6. [RelayCommand( CanExecute = nameof( CanButton ) )]
  7. void ButtonClick ()
  8. {
  9.     //点击按钮,修改标题
  10.     if ( this._IBill.IsExistId( Title ) )
  11.     {
  12.         Title = "qq" + this._IBill.GetData( Title );
  13.     }
  14.     else
  15.     {
  16.         Title = "qq";
  17.     }
  18. }
复制代码
 
 
代码中获取服务的方式
  1. this.DataContext = App.Current.Services.GetService<WindowViewModel1>();
  2. //代码任何处,都可以使用App.Current.Services.GetService获取到服务
  3. IFilesService filesService = App.Current.Services.GetService<IFilesService>();
复制代码
 
 
 
 
自我Demo地址:
https://github.com/aierong/WpfDemo/tree/main/WpfDemoNet6/IOCDemo
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
 
A.Sql Server2005 Transact-SQL 新兵器学习
B.MCAD学习
C.代码阅读总结
D.ASP.NET状态管理
E.DB(数据库)
F.WAP
G.WinForm
H.Flex

希望上面提到的知识对您有所提示,同时欢迎交流和指正
作者:aierong
出处:http://www.cnblogs.com/aierong
贴子以"现状"提供且没有任何担保,同时也没有授予任何权利!
本文版权归作者所有,欢迎转载!
原创技术文章和心得,转载注明出处!这也是对原创者的尊重!


来源:https://www.cnblogs.com/aierong/archive/2023/04/14/17318614.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具