• 欢迎访问开心洋葱网站,在线教程,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站,欢迎加入开心洋葱 QQ群
  • 为方便开心洋葱网用户,开心洋葱官网已经开启复制功能!
  • 欢迎访问开心洋葱网站,手机也能访问哦~欢迎加入开心洋葱多维思维学习平台 QQ群
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏开心洋葱吧~~~~~~~~~~~~~!
  • 由于近期流量激增,小站的ECS没能经的起亲们的访问,本站依然没有盈利,如果各位看如果觉着文字不错,还请看官给小站打个赏~~~~~~~~~~~~~!

ABP vNext 实现租户Id自动赋值插入

其他 云怀大师兄 1922次浏览 0个评论

ABP vNext 实现租户Id自动赋值插入

背景

在使用ABP vNext过程中,因为我们的用户体系庞大,所以一直与其他业务同时开发,在开发其他业务模块时,我们一直存在着误区:认为ABP vNext 自动处理了数据新增时的租户Id(TenantId)的自动赋值插入。直到我们开始接入用户权限模块后,发现并不如此。

思路

为了实现字段的自动赋值,且无感知的,我们的思路是做类似拦截器,在上层应用新增数据相关代码流程进入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 AbpDbContext<TDbContext> : Volo.Abp.EntityFrameworkCore.AbpDbContext<TDbContext>
        where TDbContext : AbpDbContext<TDbContext>
    {
        public AbpDbContext(DbContextOptions<TDbContext> 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 : AbpDbContext<BasicDbContext>, IBasicDbContext
    {
        public BasicDbContext(DbContextOptions<BasicDbContext> options)
            : base(options)
        {

        }

        protected override void OnModelCreating(ModelBuilder builder)
        {
            base.OnModelCreating(builder);

            builder.ConfigureBasic();
        }
    }
}

ABP vNext 实现租户Id自动赋值插入


开心洋葱 , 版权所有丨如未注明 , 均为原创丨未经授权请勿修改 , 转载请注明ABP vNext 实现租户Id自动赋值插入
喜欢 (0)

您必须 登录 才能发表评论!

加载中……