如何在Autofac生命周期范围内修改UnitOfWork的注册方式?
在Autofac生命周期范围内共享UnitOfWork实例的实现方案
完全可行,但不要用SingleInstance——这个选项会让UnitOfWork变成全局唯一实例,所有请求和生命周期范围都会共用同一个,这不符合UnitOfWork绑定业务事务/操作范围的设计初衷,很容易引发并发数据混乱的问题。
你需要的是让UnitOfWork在当前手动创建的生命周期范围内保持唯一,有两种实现方式:
方式一:全局修改注册规则(适用于所有生命周期范围)
把UnitOfWork的注册从InstancePerDependency改为InstancePerLifetimeScope,这样每个生命周期范围(包括你手动创建的这个scope)内,所有依赖IUnitOfWork的服务都会共用同一个实例:
builder.RegisterType<UnitOfWork>() .As<IUnitOfWork>() .InstancePerLifetimeScope(); // 替换原有的InstancePerDependency builder.RegisterAssemblyTypes(assemblies) .Where(t => t.Name.EndsWith("Service")) .AsImplementedInterfaces() .InstancePerDependency();
之后你手动创建的scope中,不管解析多少个服务,只要它们依赖IUnitOfWork,都会拿到同一个实例。
方式二:仅在特定生命周期范围内覆盖注册(不影响全局规则)
如果只想让这个特定的手动创建的scope使用唯一的UnitOfWork,而全局注册保持不变,可以在创建scope时传入配置器,临时覆盖注册规则:
using (var scope = lifetimeScope.BeginLifetimeScope(builder => { // 仅在当前scope内,UnitOfWork注册为范围内唯一 builder.RegisterType<UnitOfWork>() .As<IUnitOfWork>() .InstancePerLifetimeScope(); })) { var customerService = scope.Resolve<ICustomerService>(); // 此scope内所有依赖IUnitOfWork的服务,都会共用同一个实例 }
这种方式下,全局的UnitOfWork仍然是每次解析都生成新实例,只有这个特定scope内会使用范围内唯一的实例。
内容的提问来源于stack exchange,提问作者Ivan Debono
相关产品推荐
相关产品推荐

