You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Prism Xamarin DryIoc环境下基于ViewModel作用域的UnitOfWork复用问询

Prism DryIoc 作用域配置及使用方案

1. 基础实现同ViewModel共享UnitOfWork实例

你已经探明Prism.DryIoc默认会为每个打开的View/ViewModel创建独立作用域,要实现同一ViewModel下所有依赖服务共享同一个UnitOfWork,只需调整注册方式:

  • 将IUnitOfWork注册为Scoped作用域
  • Service1、Service2可保持Transient注册,其依赖的UnitOfWork会从当前ViewModel关联的作用域中获取,同一作用域内只会实例化一次
    注册示例:
// 在App.xaml.cs的RegisterTypes方法中添加以下注册逻辑
public partial class App : PrismApplication
{
    protected override void RegisterTypes(IContainerRegistry containerRegistry)
    {
        // 注册Scoped生命周期的UnitOfWork
        containerRegistry.RegisterScoped<IUnitOfWork, UnitOfWork>();
        // Service1、Service2可注册为Transient,不影响UnitOfWork的共享
        containerRegistry.Register<IService1, Service1>();
        containerRegistry.Register<IService2, Service2>();
        // 注册ViewModel和对应Page
        containerRegistry.RegisterForNavigation<MyPage, MyViewModel>();
    }
}

该配置下,MyViewModel实例化时,注入的Service1和Service2会拿到同一个UnitOfWork实例,实例生命周期与对应ViewModel完全绑定,ViewModel销毁(Page从导航栈弹出)时UnitOfWork会自动释放。

2. 自定义作用域配置与命名方法

Prism没有封装DryIoc的作用域命名、自定义配置相关API,你可以直接获取DryIoc原生容器实例进行操作:

2.1 注册指定命名作用域下的服务

如果需要限制某些服务仅在特定命名的作用域下才能被解析,可在注册时指定作用域名称:

// 获取DryIoc原生容器实例
var dryIocContainer = containerRegistry.GetContainer();
// 注册仅在名称为"OrderModuleScope"的作用域下生效的UnitOfWork
dryIocContainer.Register<IUnitOfWork, UnitOfWork>(Reuse.ScopedTo("OrderModuleScope"));

2.2 手动创建自定义命名作用域

如果需要在某个业务逻辑块中自定义作用域生命周期,可通过IContainerProvider手动创建作用域:

public class MyViewModel : BindableBase
{
    private readonly IContainerProvider _containerProvider;

    // 注入IContainerProvider用于手动创建作用域
    public MyViewModel(IContainerProvider containerProvider)
    {
        _containerProvider = containerProvider;
    }

    public async Task ProcessOrderAsync()
    {
        // 创建名称为"OrderModuleScope"的自定义作用域,using块结束时自动释放
        using var customScope = _containerProvider.CreateScope("OrderModuleScope");
        // 从自定义作用域解析服务,同一作用域内的Scoped服务共享实例
        var uow = customScope.Resolve<IUnitOfWork>();
        var service1 = customScope.Resolve<IService1>();
        var service2 = customScope.Resolve<IService2>();
        
        // 执行业务逻辑
        // ...
    }
}

3. 注意事项

  • 不要将Scoped生命周期的服务注入到Singleton服务中,否则Scoped服务会被提升为Singleton生命周期,导致全应用共享实例
  • 手动创建的作用域要注意及时释放,避免内存泄漏

内容的提问来源于stack exchange,提问作者Vladimir

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 05:36:04