首页 > 编程语言 >【C#/.NET】MAUI上的依赖注入

【C#/.NET】MAUI上的依赖注入

时间:2023-06-30 18:58:02浏览次数:73  
标签:依赖 C# builder fonts MAUI NET public 注入

引言

        在移动应用开发中,依赖注入是一项非常重要的技术,它可以帮助我们简化代码结构、提高可维护性并增加测试覆盖率。在最新的.NET跨平台框架MAUI中,我们也可以利用依赖注入来构建高效的应用程序架构。本文将详细介绍在MAUI上如何使用依赖注入,旨在帮助开发者更好地理解和应用这一技术。

什么是依赖注入?

        依赖注入是一种设计模式,它通过将对象的创建和依赖关系的管理交给容器来简化应用程序的开发。依赖注入有助于解耦组件之间的依赖关系,使得代码更加灵活、可扩展并且易于测试。

为什么在MAUI上使用依赖注入?

        在MAUI中,应用程序需要处理各种不同的服务、组件和资源,而这些依赖关系的管理可能会变得非常复杂。使用依赖注入可以有效地解耦这些依赖关系,使得我们能够更加专注于应用程序的业务逻辑,而无需关注底层的实现细节。

如何在MAUI上使用依赖注入?

        首先创建好一个.NET MAUI项目之后,需要有以下前提条件

<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="QuickCalc.App.MainPage">

    <Label VerticalTextAlignment="Center" 
           HorizontalTextAlignment="Center" 
           Text="{Binding LabelText}"/>

</ContentPage>

 

namespace QuickCalc.App.ViewModels;

public class LabelViewModel
{
    public string LabelText { get; set; } = "Hello World";
}

 

        我们通过依赖注入将LabelText属性绑定到Label的Text上。

 

 var builder = MauiApp.CreateBuilder();
            builder
                .UseMauiApp<App>()
                .ConfigureFonts(fonts =>
                {
                    fonts.AddFont("OpenSans-Regular.ttf", "OpenSansRegular");
                    fonts.AddFont("OpenSans-Semibold.ttf", "OpenSansSemibold");
                });
#if DEBUG
        builder.Logging.AddDebug();
#endif

            return builder.Build();

 

第一步安装Microsoft.Extensions.DependencyInjection

Install-Package Microsoft.Extensions.DependencyInjection

 

第二步打开MauiProgram.cs

  public static MauiApp CreateMauiApp()
        {
            var builder = MauiApp.CreateBuilder();
            builder
                .UseMauiApp<App>()
                .ConfigureFonts(fonts =>
                {
                    fonts.AddFont("OpenSans-Regular.ttf", "OpenSansRegular");
                    fonts.AddFont("OpenSans-Semibold.ttf", "OpenSansSemibold");
                });
            //服务注册
            builder.Services.AddSingleton<MainPage>();
            builder.Services.AddSingleton<LabelViewModel>();
#if DEBUG
        builder.Logging.AddDebug();
#endif

            return builder.Build();
        }

 

        增加的两句服务注册

builder.Services.AddSingleton<MainPage>();
builder.Services.AddSingleton<LabelViewModel>();

 

第三步修改App.xaml.cs

  public partial class App : Application
  {
      public App(MainPage mainPage)
      {
          InitializeComponent();

          MainPage = mainPage;
      }
  }

 

        增加了MainPage的构造函数注入

第四步修改MainPage.xaml.cs

 public partial class MainPage : ContentPage
 {

     public MainPage(LabelViewModel labelViewModel)
     {
         InitializeComponent();
         BindingContext = labelViewModel;
     }
 }

 

        增加了LabelViewModel的构造函数注入以及BindingContext的赋值。

第五步运行程序

        至此,运行项目可以看到hello,World!已经在MAUI中继承了依赖​

 结论

        在MAUI上,依赖注入是一个非常有价值的技术,它可以帮助我们构建简洁、灵活和可测试的应用程序。通过合理地使用依赖注入,我们能够有效地管理和解耦组件之间的依赖关系,提高开发效率和代码质量。希望本文对您理解和应用MAUI上的依赖注入有所帮助!

标签:依赖,C#,builder,fonts,MAUI,NET,public,注入
From: https://www.cnblogs.com/xuyd/p/17517620.html

相关文章

  • 【论文阅读】CONDITIONAL POSITIONAL ENCODINGS FOR VISIONTRANSFORMERS
    来自美团技术团队2023年ICLR会议上发表的论文论文地址:https://link.zhihu.com/?target=https%3A//arxiv.org/pdf/2102.10882.pdf一、Motivation由于Transformer中的Self-Attention操作是Permutation-Invariant的,也就是说,对于同一个序列,任意顺序进行排列,Self-Attention得到的一......
  • LocalDateTime日期格式化和指定日期的时分秒
    LocalDateTime日期格式化和指定日期的时分秒packagecom.example.core.mydemo.date;importjava.time.LocalDate;importjava.time.LocalDateTime;importjava.time.format.DateTimeFormatter;/***now=2023-06-30*after=2023-07-04*afterTime=2023-07-04T00:00:0......
  • go使用consul-api注册服务、注销服务
    go使用consul-api注册服务、注销服务标签(空格分隔):go,consul安装包gogetgithub.com/hashicorp/consul/api注册、注销服务packageinitializeimport( "fmt" "github.com/hashicorp/consul/api" uuid"github.com/satori/go.uuid" "go.uber.org/zap&qu......
  • Docker资源隔离与限制机制
    Docker资源隔离与限制机制资源隔离NamespaceNamespace是Linux内核一个强大的特性。每个容器都有自己单独的Namespace,运行在其中的应用都像是在独立的操作系统中运行一样。Namespace保证了容器之间彼此互不影响。PIDNamespace不同用户的进程就是通过PIDNamespace隔离开的,......
  • 祝贺!Databend Cloud 和腾讯云达成合作
    2023年6月24日,北京数变科技有限公司和腾讯云计算(北京)有限责任公司(以下简称:腾讯云)完成了DatabendCloud在腾讯云兼容性认证。本公司的产品《Databend云数据仓库系统V1.0》 正式通过了腾讯云产品《腾讯云容器服务v3COS对象存储》的技术认证,并收到了腾讯云颁发的产品认证证......
  • 基准测试BenchmarkDotNet
    今天飞书群里同事争论枚举.GetHashCode()会装箱,要改为(int)枚举,争吵不下纸上谈兵无法说服另外的人,上BenchmarkDotNet基准测试添加BenchmarkDotNet库<PackageReferenceInclude="BenchmarkDotNet"Version="0.13.5"/>性能测试用例classProgram{ staticvoidMain(strin......
  • Kubernetes集群 v1.27.3
    基础环境三个节点均需操作,以k8s-master为例主机节点进程IP配置操作系统k8s-masterdocker,kube-apiserver,etcd,kube-scheduler,kube-controller-manager,kubelet,kube-proxy,coredns,calicoNet:10.10.20.10Centos8-Streamk8s-worker01docker,kubelet,kube-proxy,calico......
  • Educational Codeforces Round 151 (Rated for Div. 2)(C,D)
    EducationalCodeforcesRound151(RatedforDiv.2)(C,D)C(dp,子序列自动机)C题目大意就就是给你一个字符串\(s\),还给出两个边界字符串\(l\)和\(r\),长度为\(m\),问我们是否可以构造满足一下条件的字符串\(1\),第\(i\)个字符必须在\(l_i\)和\(r_i\)的双闭区间里面\(2\),......
  • Cookie-细节-储存中文
        ......
  • TDengine 发布 IoT 场景下 3.0 性能对比分析报告,全方位超越 InfluxDB & TimescaleDB
    6月26日,涛思数据旗下时序数据库(TimeSeriesDatabase)TDengine正式发布IoT场景下TDengine3.0性能对比分析报告,该报告在IoT场景下从数据写入、压缩和查询等维度,对比了TDengine与市场其他流行的时序数据库产品的性能差异,其中所有测试均在标准化条件下使用公开数据完成。......