MAUI 7 结合 Prism:依赖注入与模块化开发实战指南

一、技术栈概述
  • .NET MAUI 7:跨平台移动应用框架,支持iOS/Android/Windows
  • Prism:企业级应用框架,提供:
    • 依赖注入容器(ContainerExtension
    • 模块化架构(IModule
    • 导航服务(INavigationService
    • 事件聚合(IEventAggregator
二、依赖注入实战

1. 容器配置
MauiProgram.cs中初始化Prism容器:

var builder = MauiApp.CreateBuilder();
builder.UsePrism(prism => 
    prism.RegisterTypes(container =>
    {
        // 注册服务
        container.Register<IApiService, ApiService>();
        container.RegisterSingleton<IDatabase, SqliteDatabase>();
    })
    .OnAppStart(navigation => navigation.NavigateAsync("MainPage"));

2. 构造函数注入
在ViewModel中直接使用服务:

public class MainViewModel : BindableBase
{
    private readonly IApiService _apiService;
    
    public MainViewModel(IApiService apiService) 
    {
        _apiService = apiService; // 依赖自动注入
    }
}

3. 属性注入
适用于平台特定实现:

[Dependency]
public IDeviceInfo DeviceInfo { get; set; }

三、模块化开发

1. 创建模块
新建类库项目,实现IModule

public class AuthModule : IModule
{
    public void RegisterTypes(IContainerRegistry container)
    {
        container.Register<IAuthService, AuthService>();
        container.RegisterForNavigation<LoginPage>(); // 注册视图
    }
}

2. 模块加载
在宿主应用中动态加载模块:

protected override void ConfigureModuleCatalog(IModuleCatalog moduleCatalog)
{
    moduleCatalog.AddModule<AuthModule>();
    moduleCatalog.AddModule<PaymentModule>(InitializationMode.OnDemand); // 按需加载
}

3. 模块通信
通过事件聚合器解耦:

// 发布事件
_eventAggregator.GetEvent<LoginSuccessEvent>().Publish();

// 订阅事件
_eventAggregator.GetEvent<LoginSuccessEvent>().Subscribe(HandleLogin);

四、项目结构示例
MyApp/
├── Core/                 # 共享核心逻辑
├── Modules/
│   ├── Auth.Module/      # 认证模块
│   └── Payment.Module/   # 支付模块
├── Platforms/            # 平台特定代码
└── App.xaml.cs           # Prism启动配置

五、最佳实践
  1. 分层注册

    • 基础设施层注册到容器
    • 领域服务通过接口暴露
    container.RegisterScoped<IUserRepository, UserRepository>();
    

  2. 模块设计原则

    • 单一职责:每个模块只处理特定领域
    • 低耦合:通过事件聚合器通信
    • 按需加载:减少启动时间
  3. 导航控制

    _navigationService.NavigateAsync("LoginPage?showWarning=true");
    

六、调试技巧
  1. 容器验证:
    container.Verify(); // 确保所有依赖可解析
    

  2. 使用DryIoc容器时,启用诊断日志:
    container.GetContainer().WithRules(r => r.WithFactorySelector(Rules.SelectLastRegisteredFactory()))
    

实战提示:通过模块化可将团队拆分为垂直领域小组,每个小组负责独立模块的开发与测试,大幅提升大型项目的可维护性。

开源项目参考:Prism.Maui.Samples

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐