广州 营销型网站建设,什么软件可以推广自己的产品,金山西安网站建设,wordpress生成速度显示代码背景在使用ABP vNext过程中#xff0c;因为我们的用户体系庞大#xff0c;所以一直与其他业务同时开发#xff0c;在开发其他业务模块时#xff0c;我们一直存在着误区#xff1a;认为ABP vNext 自动处理了数据新增时的租户Id#xff08;TenantId#xff09;的自动赋值插… 背景在使用ABP vNext过程中因为我们的用户体系庞大所以一直与其他业务同时开发在开发其他业务模块时我们一直存在着误区认为ABP vNext 自动处理了数据新增时的租户IdTenantId的自动赋值插入。直到我们开始接入用户权限模块后发现并不如此。思路为了实现字段的自动赋值且无感知的我们的思路是做类似拦截器在上层应用新增数据相关代码流程进入DbContext的时候在DbContext中进行处理。其他问题为了实现上层业务开发人员的【无感知】哪怕在代码编写过程中我们也不希望开发人员有所明显感知自己在使用经过处理的DbContext于是想到了与Volo.Abp.EntityFrameworkCore.AbpDbContext使用同一个名字AbpDbContext。解决方案我们首先知道在C#中如果有两个命名空间下具有同名类那么两个类的优先级为何。假设我们写的类TripleH.AbpDbContext。我们在使用这个类的地方的命名空间为TripleH.*.AClass。那么在AClass中使用AbpDbContext时我们就算引用了Volo.Abp.EntityFrameworkCore命名空间编译时也会使用TripleH.AbpDbContext。这是因为C#在此处的优先级决定的它优先找Triple.*命名空间下的AbpDbContext这个类如果没有就会逐级往上找Triple命名空间下的AbpDbContext如果找到了就会直接使用它使用时连命名空间都不需要手动引用。当然如果没找过才会去其他命名空间如Volo.Abp.EntityFrameworkCore中寻找。实现namespace TripleH
{public abstract class AbpDbContextTDbContext : Volo.Abp.EntityFrameworkCore.AbpDbContextTDbContextwhere TDbContext : AbpDbContextTDbContext{public AbpDbContext(DbContextOptionsTDbContext options): base(options){}protected override void ApplyAbpConceptsForAddedEntity(EntityEntry entry, EntityChangeReport changeReport){SetTenantIdIfNull(entry);base.ApplyAbpConceptsForAddedEntity(entry, changeReport);}protected virtual void SetTenantIdIfNull(EntityEntry entry){if (entry.Entity is IMultiTenant entityWithTenantId entityWithTenantId.TenantId null IsMultiTenantFilterEnabled){ObjectHelper.TrySetProperty(entityWithTenantId, e e.TenantId, () CurrentTenant.Id);}}}
}
使用//无需额外引用TripleH命名空间做到真正的无感知当然鼠标放到AbpDbContext上VS 会告诉你是哪个命名空间
namespace TripleH.Test.EntityFrameworkCore
{//此处继承的AbpDbContext便是来自TripleH命名空间下而非Abp[ConnectionStringName(BasicDbProperties.ConnectionStringName)]public class BasicDbContext : AbpDbContextBasicDbContext, IBasicDbContext{public BasicDbContext(DbContextOptionsBasicDbContext options): base(options){}protected override void OnModelCreating(ModelBuilder builder){base.OnModelCreating(builder);builder.ConfigureBasic();}}
}