Maui学习笔记-依赖注入简单使用

依赖注入(DI)是控制反转(IOC)模式的一种形式。DI的核心概念是类不会创建它们所依赖的对象,相反,DI框架集中解析对象并将其注入到依赖类中。通过DI可以轻松管理依赖项并实现松散耦合的体系结构。

DI简单使用案例 

  • 在这个案例中我们修改之前的模拟加载用户列表项目。

  • 首先我们创建一个DummyService的接口,然后实现该接口。

  • 创建构造函数注入该接口。

public partial class MyViewModel:ObservableObject
{
    [ObservableProperty] private ObservableCollection? users;

    [ObservableProperty]
    [NotifyCanExecuteChangedFor(nameof(InitializeCommand))]
    private bool isInitialized;
    
    IUserService _userService;
    
    public MyViewModel(IUserService userService)
    {
        _userService = userService;
    }

    [RelayCommand(CanExecute = nameof(CanInitialize))]
    async Task Initialize()
    {
        Users = new ObservableCollection(await _userService.GetUserAsync());
        IsInitialized = true;
    }


    bool CanInitialize() => !IsInitialized;
}

//用户类
public class User
{
    public string Name { get; set; }
    public int Id { get; set; }
}

//模拟服务接口
public interface IUserService
{
    Task> GetUserAsync();
}

//模拟服务实现类
public class UserService : IUserService
{
    public async Task> GetUserAsync()
    {
        await Task.Delay(5000);
        return new List()
        {
            new User() { Id = 1, Name = "张三" },
            new User() { Id = 2, Name = "李四" },
            new User() { Id = 3, Name = "王五" },
        };
    }
}

 注册服务

  • 这个案例中我们使用瞬态和单列方法来注册,并在CreateMauiApp中对注册进行分组。

  • DISource 类实现了 IMarkupExtension 接口,用于在 XAML 中通过依赖注入获取服务实例。 SourceType 属性指定要获取的服务类型。 ProvideValue 方法从当前应用程序的服务容器中获取指定类型的实例。

public static class MauiProgram
{
    public static MauiApp CreateMauiApp()
    {
        var builder = MauiApp.CreateBuilder();
        builder
            .UseMauiApp()
            .UseMauiCommunityToolkit()
            .RegisterViews()
            .RegisterAppServices()
            .RegisterViewModels()
            .ConfigureFonts(fonts =>
            {
                fonts.AddFont("OpenSans-Regular.ttf", "OpenSansRegular");
                fonts.AddFont("OpenSans-Semibold.ttf", "OpenSansSemibold");
            });
        
        
       

#if DEBUG
        builder.Logging.AddDebug();
#endif

        return builder.Build();
    }
    
    public static MauiAppBuilder RegisterViewModels(this MauiAppBuilder mauiAppBuilder)
    {
        mauiAppBuilder.Services.AddTransient();
        return mauiAppBuilder;
    }
    
    public static MauiAppBuilder RegisterViews(this MauiAppBuilder mauiAppBuilder) {
        mauiAppBuilder.Services.AddTransient();
        return mauiAppBuilder;
    }
    
    public static MauiAppBuilder RegisterAppServices(this MauiAppBuilder mauiAppBuilder) {
        mauiAppBuilder.Services.AddSingleton();
        return mauiAppBuilder;
    }

}

public class DISource : IMarkupExtension
{
    public Type SourceType { get; set; }
    public object ProvideValue(IServiceProvider serviceProvider)
    {
        return Application.Current.MainPage.Handler.MauiContext.Services.GetService(SourceType);
    }
}
  • 主页引入DISource



    
        
    
    
        
            
                
                    
                        
                
            
        
        
    

 

  • 创建DISource是为了在xaml中获取服务,而无需在隐藏代码中注入MyViewModel。

Maui中DI包括三种注册类型

Transient
  • 当从DI容器中请求实例时,都会创建一个新的页面实例,这里注意一下如果使用shell导航一个页面然后返回,则不会创建新的实例。

Singleton 
  • 如果页面注册为单例,则只会创建一次,在导航中回到该页面,使用的还是相同的实例。这有助于缩短后续打开页面的时间。

  • 单例适用于在程序之间共享数据和状态的常用页面和服务。

Scoped 
  • 对于在同一页面上多个视图之间共享同一个服务使用它会很方便。

在MVVM模式中绑定也是核心机制之一,在项目中一个视图可能要有很多绑定,使用x:DataType属性很有用,它在编译时解析绑定,可以避免很多错误并且还会提高性能。需要注意的是如果绑定源具有object类型的属性,无法使用DataType。

 

你可能感兴趣的:(Maui学习笔记,学习,笔记,ios,c#)