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
相关产品推荐
相关产品推荐

