Bootstrap

C# MVVM 牛牛的实现依赖注入和MVVM绑定(DependencyInjection+CommunityToolkit)

这段时间在网上发现搜索MVVM数据绑定时,发现很多都是最基本的数据绑定,完全没有考虑依赖注入的问题,这里实现一下我们的方法,让我们的数据绑定和依赖注入都变得简单起来。

安装资源包

首先我们要下载一下资源包DependencyInjection和CommunityToolkit,直接在包管理里面进行搜索下载。

Microsoft.Extensions.DependencyInjection
CommunityToolkit.Mvvm

下载完成后我们接下来就要开始配置了。

包管理

这个是我们的项目包,大家可以根据自己的项目建其他的包

  • common 工具包
  • interfaces 实现类接口包
  • MOdels 实体类
  • Services 实现类
  • styles 资源
  • ViewModels 视图模型
  • Views 视图
  • ServiceLocator 配置类
    ##

App.xaml.cs

  public partial class App : Application
  {
      public new static App Current => (App)Application.Current;
  }

App.xaml

 <Application.Resources>
   <ResourceDictionary>
     <local:ServiceLocator x:Key="ServiceLocator" />
   </ResourceDictionary>
 </Application.Resources>

ServiceLocator

using Microsoft.Extensions.DependencyInjection;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Formin
{
    public class ServiceLocator
    {
        private IServiceProvider _serviceProvider;
        public MainViewModel  MainViewModel => _serviceProvider.GetService<MainViewModel>();

        public ServiceLocator()
        {
            var serviceCollection = new ServiceCollection();
            serviceCollection.AddSingleton<IUserServices, UserServices>();        
            serviceCollection.AddTransient<MainViewModel>();
            _serviceProvider = serviceCollection.BuildServiceProvider();
        }
    }
}

这里封装方法,实现我们的依赖注入和MVVM绑定。

实现类接口

IUserServices

 public interface IUserServices
 {
     User Login(string username, string password);
 }

实现类

UserServices

public class UserServices : IUserServices
{
    public User Login(string username, string password)
    {
        throw new NotImplementedException();
    }
}

实体类

User

  public class User
  {
      public int Id { get; set; }
      // <summary>用户名</summary>
      private string _userName;
      public string UserName { get => _userName; set => SetProperty(ref _userName, value); }
      // <summary>密码</summary>
      private string _passWork;
      public string PassWork { get => _passWork; set => SetProperty(ref _passWork, value); }
      // <summary>级别</summary>
      private string _level;
      public string Level { get => _level; set => SetProperty(ref _level, value); }
  }

MainWindowViewModel

public class MainWindowViewModel : ObservableObject
{
	private readonly IUserServices _userServices;
     public MainViewModel(IUserServices userServices)
 	{
 	 _userServices = userServices;
 	 load();
 	}
 	pubulic void load()
 	{
 	User user = _userServices.Login();
 	}
}

MainWindow

在这里插入图片描述

DataContext= "{Binding MainViewModel,Source={StaticResource ServiceLocator}}"

这里我们只需要在view页面加上这一句话就OK了,其他的页面如此这样写,到这里大功告成,牛牛的,如有疑问,敬请留言。

小白路漫漫,让我们一起加油!!!

;