.NET桌面应用架构Demo与实战|WPF+MVVM+EFCore+IOC+DI+Code First+AutoMapper

目录

  • .NET桌面应用架构Demo与实战|WPF+MVVM+EFCore+IOC+DI+Code First+AutoPapper
  • 技术栈简述
  • 项目地址:
  • 功能展示
  • 项目结构
  • 项目引用
  • 1. 新建模型
  • 2. Data层,依赖EF Core,实现数据库增删改查
  • 3. Bussiness层,实现具体的业务逻辑
  • 4. Service层,业务逻辑封装
  • 5. UI层,用户界面
        • 初始化应用程序的服务和组件
      • 主要组件
      • **IHost**主机构建器
        • 配置:通过`AddConfiguration`方法加载`appsettings.json`和环境变量。
        • 注册对象映射
        • 数据库配置
        • 注册应用程序服务
        • 注册视图模型
        • 注册视图
        • 定义AutoMapper映射规则
        • 应用程序启动与关闭
      • 示例
      • UI+ViewModelM界面交互处理
  • 参考

.NET桌面应用架构Demo与实战|WPF+MVVM+EFCore+IOC+DI+Code First+AutoPapper

该应用程序旨在高效地管理日常工作中所需的AI Prompt,支持新增、编辑、删除、快速复制以及查询等功能。然而,这些功能本身并不是本文讨论的重点;更关注的是背后的技术实现与架构设计思路。功能灵感来自ChatHub - GPT-4o, Claude 3.5, Gemini 1.5 side by side

技术栈简述

  • MVVM设计模式 将应用程序分为三个核心组件:模型(Model)、视图(View)和视图模型(ViewModel)。这种分离关注点的方法提高了应用程序的可维护性和可测试性。
  • EFCore :一个轻量级的、可扩展的ORM(对象关系映射)框架,用于.NET平台。它允许使用C#代码来处理数据库操作,而不是直接编写SQL语句。
  • Code First模式:EFCore支持Code First开发模式,开发者可以直接通过C#类定义来创建数据库模型,然后EFCore会自动生成数据库架构。
  • IOC :一种设计原则,它倒置了传统程序设计中的控制流,使得高层模块不依赖于低层模块,两者都依赖于抽象。
  • DI :实现IOC的一种方式,它通过外部注入依赖来实现模块间的解耦。
  • AutoMapper:是一个对象到对象的映射库,它可以帮助开发者自动转换不同类型的对象,例如将数据库实体(Model)映射到视图模型(ViewModel)。

总体来讲,EFCore简化了数据库操作,而IOC和DI则提高了应用程序的可维护性和可测试性,AutoMapper的加入进一步减少了对象映射的复杂性。使用这些技术栈的组合,使得AI Prompt管理应用的开发更加高效、灵活和可靠。

项目地址:

https://github.com/Nita121388/NitasDemo/tree/main/08WPFArctitectureDemo

功能展示

软件启动后,会展示一个列表,其中包含了所有的AI Prompt(AI Prompt)。用户可以通过以下操作来管理这些Prompt:

  1. 查看所有Prompt:软件启动时,用户将看到一个包含所有AIPrompt的列表,方便快速浏览。
  2. 新增Prompt:用户可以通过点击“新增”按钮来添加新的AI Prompt。点击后,会弹出一个编辑界面,用户可以在这里输入标题和内容,完成新Prompt的创建。
  3. 编辑Prompt:在Prompt列表中,用户可以通过点击“编辑”按钮来修改现有的AIPrompt。编辑界面会加载当前Prompt的内容,用户可以对其进行修改。
  4. 删除Prompt:用户可以通过点击“删除”按钮来移除不再需要的AIPrompt。
  5. 使用Prompt:用户可以通过点击“使用”按钮来将选中的AI Prompt复制到系统剪贴板,用户就可以将Prompt粘贴到任何需要的AI对话系统中,以便快速输入或引用。
  6. 导出Prompt:用户可以通过点击“导出”按钮来保存当前所有的AI Prompt到一个Json文件中。这个操作允许用户将Prompt列表导出为JSON文件,方便备份或在其他设备上导入。
  7. 导入Prompt:用户可以通过点击“导入”按钮来从文件中加载AI Prompt。点击后,会弹出一个文件选择对话框,用户可以选择包含Prompt信息的文件进行导入。导入成功后,软件会将文件中的Prompt添加到现有的Prompt列表中。
    在这里插入图片描述

项目结构

应用分层架构通过将应用程序划分为UI层、服务层、业务逻辑层、数据访问层和领域模型层,实现了关注点分离。每个层级都有明确的职责,UI层负责用户界面,服务层提供业务操作接口,业务逻辑层处理具体的业务需求,数据访问层处理数据库交互,而领域模型层则定义了业务实体。

WFArchitectureDemo                                                         
 │                                                                            
 ├───────►UI                                                                  
 │         │                                                                  
 │         ├─────►Common                                                      
 │         │        Helper                                                    
 │         │        HostBuilders               //主机构建器(HostBuilder)    配置应用程序的各种设置
 │         ├─────►Converters                                                  
 │         │        PercentageConverter.cs                                       
 │         ├─────►ViewModels                                                  
 │         ├─────►Views                                                       
 │         ├─────►App.xaml                                                    
 │         │      App.xaml.cs                  //依赖注入与配置管理                                 
 │         ├─────►appsettings.json             //数据库设置                               
 │         └─────►MainWindow.xaml              //启动界面                                                                                                          
 │                                                                            
 ├────────►Service                                                            
 │         │                                                                  
 │         ├─────►IServices                    //服务接口                              
 │         │        IPromptService.cs                                         
 │         ├─────►Services                     //服务实现                                
 │         │        PromptService.cs                                          
 │         └─────►Result.cs                                                                                                                              
 │                                                                            
 ├────────►Business                                                           
 │         │                                                                  
 │         ├────►IManager                      //业务逻辑接口                              
 │         │      IPromptManager.cs                                           
 │         │                                                                  
 │         ├────►Manager                       //具体的业务逻辑                               
 │         │      PromptManager.cs                                            
 │         │                                                                  
 │         └────►DTO                           //数据传输对象                               
 │                PromptDTO.cs                                                
 │                PromptUsageDTO.cs                                           
 │                                                                            
 ├────────►Data                                //负责与数据库的直接交互,包括CRUD操作                              
 │         │                                                                  
 │         ├────►RepositoryFactory                                            
 │         │      RepositoryFactory.cs                                        
 │         │                                                                  
 │         ├────►IRepository                   //仓储模式、CURD接口  
 │         │      IRepository.cs
 │         │      IPromptRepository.cs                                        
 │         │      IPromptUsageRepository.cs                                  
 │         │                                                                  
 │         ├────►Repository                    //仓储模式、CURD实现                            
 │         │      PromptRepository.cs                                         
 │         │      PromptUsageRepository.cs                                   
 │         │                                                                  
 │         ├────►DatabaseContexts              //EF Core的数据库上下文                               
 │         │      DbContextFactory.cs                                         
 │         │      PromptDbContext.cs                                          
 │         │                                                                  
 │         └────►Migrations                    //数据迁移文件,管理数据库变化                               
 │                                                                            
 └────────►Domainn                             //领域模型                               
           │                                                                  
           └────►Models                                                       
                  Prompt.cs                                                   
                  PromptUsage.cs                                              

项目引用

  • CommunityToolkit.Mvvm
  • Microsoft.Xaml.Behaviors.Wpf
  • AutoMapper
  • Microsoft.Extensions.Configuration
  • Microsoft.Extensions.DependencyInjection
  • Microsoft.Extensions.Hosting
  • Microsoft.EntityFrameworkCore
  • Microsoft.EntityFrameworkCore.Sqlite
  • Microsoft.EntityFrameworkCore.Tools
  • Microsoft.EntityFrameworkCore.Design

以下为该项目一步一步一层层的实现大致过程和概述。

1. 新建模型

public class Prompt
{
    public long ID { get; set; }
    public string Title { get; set; }
    public string Content { get; set; }
    public bool IsDelete { get; set; }
    public DateTime CreateDateTime { get; set; }
    public DateTime UpdateDateTime { get; set; }

    public ICollection<PromptUsage> PromptUsages { get; set; } = new List<PromptUsage>();
}

public class PromptUsage
{
    public long ID { get; set; }
    public long PromptID { get; set; }
    public DateTime CreateDateTime { get; set; }
    public Prompt Prompt { get; set; }
}



2. Data层,依赖EF Core,实现数据库增删改查

该层引用:

  • Microsoft.EntityFrameworkCore
  • Microsoft.EntityFrameworkCore.Sqlite
  • Microsoft.EntityFrameworkCore.Tools
  • Microsoft.EntityFrameworkCore.Design
  1. 定义仓储接口IRepository
    public interface IRepository<T>
    {
        T Add(T entity);
        void Delete(long id);
        void Update(T entity);
        List<T> Get();
        List<T> Select(string filterSql,string orderBySql);
        T Get(long id);
        List<T> GetByForeignKey(long id);
    }
    
  2. IPromptRepository和IPromptUsageRepository都继承自IRepository 接口,在由PromptRepository和PromptUsageRepository
  3. PromptRepository和PromptUsageRepository依赖DbContextFactory提供的数据库上下文,具体实现增删改查
  4. PromptDbContext是构建数据访问层的核心,继承DbContext,使用 EF Core 来定义数据库上下文、配置实体和它们之间的关系。
     public class PromptDbContext : DbContext
     {
         public DbSet<Prompt> Prompts { get; set; }
         public DbSet<PromptUsage> PromptUsages { get; set; }
    
         public PromptDbContext(DbContextOptions options) : base(options)
         { } //设计时不能包含此行内容 
         
    
         protected override void OnModelCreating(ModelBuilder modelBuilder)
          {
              // 配置 Prompt 实体
              modelBuilder.Entity<Prompt>(entity =>
              {
                  entity.HasKey(e => e.ID);
                  entity.HasMany(e => e.PromptUsages)
                      .WithOne(u => u.Prompt)
                      .HasForeignKey(u => u.PromptID);
              });
    
              // 配置 PromptUsage 实体
              modelBuilder.Entity<PromptUsage>(entity =>
              {
                  entity.HasKey(e => e.ID);
              });
          }
     }
    
  5. Code First模式,生成迁移文件,创建数据库

    💡

    1. Microsoft.EntityFrameworkCore.Tools是一个包含了用于创建、更新和管理数据库迁移的命令行工具的程序包。这些工具允许开发者在不直接修改数据库架构的情况下,通过代码来跟踪和更新数据库的变化。这些迁移可以应用于不同的数据库环境,从而帮助实现数据库的持续集成和持续部署。
    2. Microsoft.EntityFrameworkCore.Design包则主要用于在设计时为EF Core提供支持和功能,包括生成代码和模型等。虽然它本身不直接提供迁移功能,但它是迁移功能所依赖的一个重要组件。
      在Vistual Studio →工具→NuGet包管理器→程序包管理器控制台,执行以下命令:
      在这里插入图片描述
    PM> Add-Migration Init
    Build started...
    Build succeeded.
    To undo this action, use Remove-Migration.
    PM> update-database
    Build started...
    Build succeeded.
    Applying migration '20241108031752_Init'.
    Done.
    PM> 
    
    然后可以看到项目中新增了文件夹Migrations,其包含20241114045010_init.cs和PromptDbContextModelSnapshot
  • 20241114045010_init.cs:包含了一个迁移类,它定义了数据库架构的变化。这个类包含了UpDown方法,分别用于应用迁移和撤销迁移。
  • PromptDbContextModelSnapshot:它包含了当前数据库上下文的模型快照。这个快照用于在添加新的迁移时比较模型的变化,确保迁移的准确性。

3. Bussiness层,实现具体的业务逻辑

Bussiness层调用Data层实现具体的业务逻辑,要依旧这层依赖倒置原则(Dependency Inversion Principle, DIP)——高层模块不应该依赖于低层模块,二者都应该依赖于其抽象;抽象不应该依赖于细节,细节应该依赖于抽象。IManager中是对外提供的接口,Manager中是具体的实现。

4. Service层,业务逻辑封装

Service层调用Bussiness层 可以进一步封装和抽象业务逻辑,使其更加模块化和可重用。

5. UI层,用户界面

初始化应用程序的服务和组件

App.xaml.cs开始,这是WPF应用程序的入口点。创建了一个继承自ApplicationApp类,并在其中初始化应用程序的服务和组件,处理启动和退出事件,并确保数据库的迁移和主窗口的显示。

主要组件

  1. IServiceProvider:提供对应用程序服务的访问。
  2. IHost:.NET Core的主机构建器,用于配置和启动应用程序。

IHost主机构建器

定义一个CreateHostBuilder方法,它使用Host.CreateDefaultBuilder来设置主机构建器,并通过一系列静态类来扩展IHostBuilder,来简化主机构建器的配置,以便在应用程序启动时注册所需的服务。

 public static IHostBuilder CreateHostBuilder(string[] args = null)
    {
        return Host.CreateDefaultBuilder(args)
            .AddConfiguration()
            .AddAutoMapper()
            .AddDbContext()
            .AddServices()
            .AddViewModels()
            .AddViews();
    }

通过模块化配置,将不同的功能(如数据库访问、业务逻辑、视图模型等)分离到不同的类中,从而提高代码的可读性和可维护性。添加了以下组件:

配置:通过AddConfiguration方法加载appsettings.json和环境变量。
 public static IHostBuilder AddConfiguration(this IHostBuilder host)
 {
     host.ConfigureAppConfiguration(c =>
     {
         c.AddJsonFile("appsettings.json");
         c.AddEnvironmentVariables();
     });

     return host;
 }
注册对象映射

在代码中涉及将DTO对象转为ViewModel,此处采用AutoMapper来实现便捷的映射

 public static IHostBuilder AddAutoMapper(this IHostBuilder host)
 {
     host.ConfigureServices((context, services) =>
     {
         services.AddAutoMapper(typeof(App));
     });
     return host;
 }
数据库配置

通过AddDbContext方法配置Entity Framework Core,数据库上下文

public static IHostBuilder AddDbContext(this IHostBuilder host)
{
    host.ConfigureServices((context, services) =>
    {
        string connectionString = context.Configuration.GetConnectionString("sqlite");
        Action<DbContextOptionsBuilder> configureDbContext = o => o.UseSqlite(connectionString);

        // 注册 DbContext
        services.AddDbContext<PromptDbContext>(configureDbContext);
        services.AddSingleton<DbContextFactory>(sp => new DbContextFactory(configureDbContext));
        services.AddSingleton<RepositoryFactory>(sp => new RepositoryFactory(configureDbContext));
    });
    return host;
}
注册应用程序服务
public static IHostBuilder AddServices(this IHostBuilder host)
{
    host.ConfigureServices(services =>
    {
        // 注册 IPromptManager 和 IPromptService
        services.AddSingleton<IPromptManager, PromptManager>(sp =>
        {
            var repositoryFactory = sp.GetRequiredService<RepositoryFactory>();
            return new PromptManager(repositoryFactory);
        });

        services.AddSingleton<IPromptService, PromptService>(sp =>
        {
            var promptManager = sp.GetRequiredService<IPromptManager>();
            return new PromptService(promptManager);
        });
    });
    return host;
}

使用

 private IPromptService _promptService;
 private IMapper _mapper;
 public PromptsViewModel()
 {
     _promptService = App.Current.Services.GetRequiredService<IPromptService>();
     _mapper = App.Current.Services.GetRequiredService<IMapper>();
 }
注册视图模型
 public static IHostBuilder AddViewModels(this IHostBuilder host)
 {
     host.ConfigureServices(services =>
     {
         services.AddTransient<PromptsViewModel>();
     });

     return host;
 }

使用:

 public MainWindow()
 {
     InitializeComponent(); 
     ViewModel = App.Current.Services.GetRequiredService<PromptsViewModel>();
     ViewModel.Refresh();
     DataContext = ViewModel;
 }
注册视图
public static IHostBuilder AddViews(this IHostBuilder host)
{
    host.ConfigureServices(services =>
    {
        services.AddSingleton<MainWindow>();
    });

    return host;
}

使用

 Window window = _host.Services.GetRequiredService<MainWindow>();
 window.Show();
定义AutoMapper映射规则

AutoMapper用于简化对象之间的映射。创建了一个MappingProfile类来定义映射规则。

public class MappingProfile : Profile
{
    public MappingProfile()
    {
        // PromptUsageViewModel => PromptUsageDTO
        CreateMap<PromptUsageViewModel, PromptUsageDTO>();

        //PromptUsageDTO => PromptUsageViewModel
        CreateMap<PromptUsageDTO, PromptUsageViewModel>();

        // PromptViewModel => PromptDTO
        CreateMap<PromptViewModel, PromptDTO>()
            .ForMember(
            dest => dest.Usages, 
            opt => opt.MapFrom(src => src.Usages.ToList()));

        CreateMap<PromptDTO, PromptViewModel>()
            .ForMember(
            dest => dest.Usages,
            opt => opt.MapFrom(src => src.Usages.ToList()));

    }
}

使用示例

var promptViewModel = _mapper.Map<PromptViewModel>(promptDTO);
应用程序启动与关闭

OnStartup方法中,启动主机(这会触发所有服务的注册和初始化),然后执行数据库迁移,最后显示主窗口。在OnExit方法中,停止并释放主机资源。

/// <summary>
/// 在应用程序启动时执行的操作。
/// </summary>
protected override void OnStartup(StartupEventArgs e)
{
    base.OnStartup(e); 

    // 启动主机,这将触发所有服务的注册和初始化。
    _host?.Start();

    // 获取DbContextFactory服务的实例,用于创建数据库上下文。
    DbContextFactory contextFactory = _host.Services.GetRequiredService<DbContextFactory>();

    // 使用DbContextFactory创建数据库上下文实例,并应用所有未应用的迁移。
    // 这确保了数据库结构是最新的,以匹配应用程序的数据模型。
    using (var context = contextFactory.CreateDbContext())
    {
        context.Database.Migrate();
    }

    // 获取MainWindow服务的实例
    Window window = _host.Services.GetRequiredService<MainWindow>();

    // 显示主窗口
    window.Show();
}

protected override async void OnExit(ExitEventArgs e)
{
    // 等待_host对象的StopAsync方法完成,这个方法应该是停止一些后台服务的操作。
    await _host.StopAsync();
    
    // 释放_host对象所占用的资源。
    _host.Dispose();

    // 调用基类的OnExit方法,确保基类的退出逻辑也能被执行。
    base.OnExit(e);
}

示例

/// <summary>
/// Interaction logic for App.xaml
/// </summary>
public partial class App : Application
{
    public new static App Current => (App)Application.Current;
    public IServiceProvider Services { get; }
    private readonly IHost _host;
    public App()
    {
        _host = CreateHostBuilder().Build();
        Services = _host.Services;
    }

    public static IHostBuilder CreateHostBuilder(string[] args = null)
    {
        return Host.CreateDefaultBuilder(args)
            .AddConfiguration()
            .AddAutoMapper()
            .AddDbContext()
            .AddServices()
            .AddViewModels()
            .AddViews();
    }

    protected override void OnStartup(StartupEventArgs e)
    {
        base.OnStartup(e);
        _host?.Start();

        DbContextFactory contextFactory = _host.Services.GetRequiredService<DbContextFactory>();
        using (var context = contextFactory.CreateDbContext())
        {
            context.Database.Migrate();
        }

        Window window = _host.Services.GetRequiredService<MainWindow>();
        window.Show();
    }

    protected override async void OnExit(ExitEventArgs e)
    {
        await _host.StopAsync();
        _host.Dispose();
        base.OnExit(e);
    }
}

UI+ViewModelM界面交互处理

在用户界面层(UI Layer)中,采用了CommunityToolkit.Mvvm库来实现MVVM(Model-View-ViewModel)设计模式。通过MVVM模式,实现了命令绑定和数据绑定,使得用户界面与业务逻辑之间的交互更加清晰和高效。因为此处不是本文重点所以不详细介绍啦。

参考

  1. 实体框架文档中心 | Microsoft Learn
  2. https://www.youtube.com/playlist?list=PLA8ZIAm2I03jSfo18F7Y65XusYzDusYu5
  3. Construction — AutoMapper documentation
  4. SingletonSean/SimpleTrader:全栈 WPF MVVM 交易应用程序。 — SingletonSean/SimpleTrader: A full stack WPF MVVM trading application.
  5. xtenzQ/WPF-MVVM-EFC-Example: 📲 MVVM (WPF) application built with EFCore, Abstract Factory pattern and dependency injection (Microsoft Unity)

平平无奇的代码小白,如有问题请多指正!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/918405.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

c++学习第三天

创作过程中难免有不足&#xff0c;若您发现本文内容有误&#xff0c;恳请不吝赐教。 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、内联函数 1.铺垫 #include<iostream>//实现一个ADD的宏函数 //#define ADD(x, y) xy //错解1 //#defin…

html 图片转svg 并使用svg路径来裁剪html元素

1.png转svg 工具地址: Vectorizer – 免费图像矢量化 打开svg图片,复制其中的path中的d标签的路径 查看生成的svg路径是否正确 在线SVG路径预览工具 - UU在线工具 2.在html中使用svg路径 <svg xmlns"http://www.w3.org/2000/svg" width"318px" height…

Solana应用开发常见技术栈

编程语言 Rust Rust是Solana开发中非常重要的编程语言。它具有高性能、内存安全的特点。在Solana智能合约开发中&#xff0c;Rust可以用于编写高效的合约代码。例如&#xff0c;Rust的所有权系统可以帮助开发者避免常见的内存错误&#xff0c;如悬空指针和数据竞争。通过合理利…

23种设计模式-访问者(Visitor)设计模式

文章目录 一.什么是访问者模式&#xff1f;二.访问者模式的结构三.访问者模式的应用场景四.访问者模式的优缺点五.访问者模式的C实现六.访问者模式的JAVA实现七.代码解释八.总结 类图&#xff1a; 访问者设计模式类图 一.什么是访问者模式&#xff1f; 访问者模式&#xff08;…

RecyclerView详解——(四)缓存复用机制

稍微看了下源码和部分文章&#xff0c;在此做个小小的总结 RecyclerView&#xff0c;意思为可回收的view&#xff0c;那么相对于listview&#xff0c;他的缓存复用肯定是一大优化。 具体而言&#xff0c;当一个列表项被移出屏幕后&#xff0c;RecyclerView并不会销毁其视图&a…

C++设计模式行为模式———迭代器模式

文章目录 一、引言二、迭代器模式三、总结 一、引言 迭代器模式是一种行为设计模式&#xff0c; 让你能在不暴露集合底层表现形式 &#xff08;列表、 栈和树等&#xff09; 的情况下遍历集合中所有的元素。C标准库中内置了很多容器并提供了合适的迭代器&#xff0c;尽管我们不…

【网络云计算】2024第48周-技能大赛-初赛篇

文章目录 1、比赛前提2、比赛题目2.1、 修改CentOS Stream系统的主机名称&#xff0c;写出至少3种方式&#xff0c;并截图带时间戳和姓名&#xff0c;精确到秒&#xff0c;否则零分2.2、 创建一个名为你的名字的拼音的缩写的新用户并设置密码&#xff0c;将用户名添加到 develo…

【汇编语言】数据处理的两个基本问题(三) —— 汇编语言的艺术:从div,dd,dup到结构化数据的访问

文章目录 前言1. div指令1.1 使用div时的注意事项1.2 使用格式1.3 多种内存单元表示方法进行举例1.4 问题一1.5 问题一的分析与求解1.5.1 分析1.5.2 程序实现 1.6 问题二1.7 问题二的分析与求解1.7.1 分析1.7.2 程序实现 2. 伪指令 dd2.1 什么是dd&#xff1f;2.2 问题三2.3 问…

R语言数据分析案例45-全国汽车销售数据分析(可视化与回归分析)

一、研究背景 随着经济的发展和人们生活水平的提高&#xff0c;汽车已经成为人们日常生活中不可或缺的交通工具之一。汽车市场的规模不断扩大&#xff0c;同时竞争也日益激烈。对于汽车制造商和经销商来说&#xff0c;深入了解汽车销售数据背后的规律和影响因素&#xff0c;对…

【算法】【优选算法】前缀和(下)

目录 一、560.和为K的⼦数组1.1 前缀和1.2 暴力枚举 二、974.和可被K整除的⼦数组2.1 前缀和2.2 暴力枚举 三、525.连续数组3.1 前缀和3.2 暴力枚举 四、1314.矩阵区域和4.1 前缀和4.2 暴力枚举 一、560.和为K的⼦数组 题目链接&#xff1a;560.和为K的⼦数组 题目描述&#x…

论文 | Learning to Transfer Prompts for Text Generation

1. 总结与提问 论文摘要总结&#xff1a; 论文提出了一种创新的PTG&#xff08;Prompt Transfer Generation&#xff09;方法&#xff0c;旨在通过迁移提示的方式解决传统预训练语言模型&#xff08;PLM&#xff09;在数据稀缺情况下微调的问题。通过将一组已在源任务中训练好…

TON商城与Telegram App:生态融合与去中心化未来的精彩碰撞

随着区块链技术的快速发展&#xff0c;去中心化应用&#xff08;DApp&#xff09;逐渐成为了数字生态的重要组成部分。而Telegram作为全球领先的即时通讯应用&#xff0c;不仅仅满足于传统的社交功能&#xff0c;更在区块链领域大胆探索&#xff0c;推出了基于其去中心化网络的…

自动驾驶系列—探索自动驾驶数据管理的核心技术与平台

&#x1f31f;&#x1f31f; 欢迎来到我的技术小筑&#xff0c;一个专为技术探索者打造的交流空间。在这里&#xff0c;我们不仅分享代码的智慧&#xff0c;还探讨技术的深度与广度。无论您是资深开发者还是技术新手&#xff0c;这里都有一片属于您的天空。让我们在知识的海洋中…

【技术解析】Dolphinscheduler实现MapReduce任务的高效管理

MapReduce是一种编程模型&#xff0c;用于处理和生成大数据集&#xff0c;主要用于大规模数据集&#xff08;TB级数据规模&#xff09;的并行运算。本文详细介绍了Dolphinscheduler在MapReduce任务中的应用&#xff0c;包括GenericOptionsParser与args的区别、hadoop jar命令参…

数据结构哈希表-(开放地址法+二次探测法解决哈希冲突)(创建+删除+插入)+(C语言代码)

#include<stdio.h> #include<stdlib.h> #include<stdbool.h> #define M 20 #define NULLDEL -1 #define DELDEY -2typedef struct {int key;int count; }HashTable;//创建和插入 void Insert(HashTable ha[], int m, int p, int key) {int i, HO, HI;HO key…

【android USB 串口通信助手】stm32 源码demo 单片机与手机通信 Android studio 20241118

android 【OTG线】 接 下位机STM32【USB】 通过百度网盘分享的文件&#xff1a;USBToSerialPort.apk 链接&#xff1a;https://pan.baidu.com/s/122McdmBDUxEtYiEKFunFUg?pwd8888 提取码&#xff1a;8888 android 【OTG线】 接 【USB转TTL】 接 【串口(下位机 SMT32等)】 需…

大数据技术Kafka详解 ① | 消息队列(Messages Queue)

目录 1、消息队列的介绍 2、消息队列的应用场景 2.1、应用耦合 2.2、异步处理 2.3、限流削峰 2.4、消息驱动的系统 3、消息队列的两种模式 3.1、点对点模式 3.2、发布/订阅模式 4、常用的消息队列介绍 4.1、RabbitMQ 4.2、ActiveMQ 4.3、RocketMQ 4.4、Kafka 4.…

一家餐饮企业,「闯入」AI阵地

作者| 皮爷 出品|产业家 “我们需要用AI来帮助我们门店破除内卷的状态。”一位连锁餐饮品牌告诉产业家&#xff0c;“这也是我们想尽快把AI用起来的原因&#xff0c;看看能不能带来一些帮助。” 这种情况正发生在一众餐饮企业中。 与这种情况对应的一个背景是&#xff0c…

MySQL的编程语言

一、MySQL基础 使用系统的全局变量@@VERSION查看当前使用的MySQL的版本信息,SQL语句如下: select @@version; 将局部变量varl声明为char的类型,长度值为10,并为其赋值为“程菲” begin declare var1 char(10); set @var1="程菲"; end 通过局部变量查看d_eams数…

【青牛科技】电动工具直流调速专用集成电路GS069,具有电源电压范围宽、功耗小、抗干扰能力强等特性

GS069是芯谷科技推出的一款CMOS工艺、电动工具直流调速专用集成电路。具有电源电压范围宽、功耗小、抗干扰能力强等特点&#xff0c;广泛应用于各种电动工具。 产品基本参数 产品应用 1、应用图&#xff1a; 2、测试参数&#xff1a;&#xff08;VCC9V&#xff0c;RL2K&#…