【问题标题】:How to list available tenants in ABP Framework Angular app如何在 ABP Framework Angular 应用程序中列出可用租户
【发布时间】:2021-01-19 19:19:36
【问题描述】:

我希望在我的主页(在 ABP 框架生成的 Angular 应用程序上)列出可用的租户。列表中的每个项目都应该有一个指向该租户的链接。

第一个问题是我找不到应该返回租户的服务:我尝试了 AbpTenantServiceMultiTenancyService

在 ASP.NET Core 主机上生成了一个端点 (GET /api/multi-tenancy/tenants),但我似乎在 TypeScript 中找不到代理。

我确实确保运行abp generate-proxy

附带的问题是,将__tenant={tenant_name}__tenant={tenant_id} 传递给查询字符串似乎无法更改租户。

根据documentation,默认模板包括查询字符串租户解析器:QueryStringTenantResolveContributor

【问题讨论】:

    标签: angular asp.net-core abp


    【解决方案1】:

    以下是获取租户的方法(从主机端)

    public class GetTenantsInput : PagedAndSortedResultRequestDto
        {
            public string Filter { get; set; }
        }
    

     public class SaasTenantDto : ExtensibleEntityDto<Guid>
        {
            public string Name { get; set; }
        }
    

    public class EfCoreTenantRepository : EfCoreRepository<ISaasDbContext, Tenant, Guid>, ITenantRepository
    {
        public EfCoreTenantRepository(IDbContextProvider<ISaasDbContext> dbContextProvider)
            : base(dbContextProvider)
        {
    
        } 
    
        public virtual async Task<List<Tenant>> GetListAsync(
            string sorting = null,
            int maxResultCount = int.MaxValue,
            int skipCount = 0,
            string filter = null,
            bool includeDetails = false,
            CancellationToken cancellationToken = default)
        {
            return await (await GetDbSetAsync())
                .IncludeDetails(includeDetails)
                .WhereIf(
                    !filter.IsNullOrWhiteSpace(),
                    u =>
                        u.Name.Contains(filter)
                )
                .OrderBy(sorting ?? nameof(Tenant.Name))
                .PageBy(skipCount, maxResultCount)
                .ToListAsync(GetCancellationToken(cancellationToken));
        }
    
        public virtual async Task<long> GetCountAsync(string filter = null, CancellationToken cancellationToken = default)
        {
            return await this
                .WhereIf(
                    !filter.IsNullOrWhiteSpace(),
                    u =>
                        u.Name.Contains(filter)
                ).CountAsync(cancellationToken: cancellationToken);
        }
    
        [Obsolete("Use WithDetailsAsync method.")]
        public override IQueryable<Tenant> WithDetails()
        {
            return GetQueryable().IncludeDetails();
        }
    
        public override async Task<IQueryable<Tenant>> WithDetailsAsync()
        {
            return (await GetQueryableAsync()).IncludeDetails();
        }
    }
    

    public virtual async Task<PagedResultDto<SaasTenantDto>> GetListAsync(GetTenantsInput input)
    {
        var count = await TenantRepository.GetCountAsync(input.Filter);
        var list = await TenantRepository.GetListAsync(
            input.Sorting,
            input.MaxResultCount,
            input.SkipCount,
            input.Filter
        );
    
        var tenantDtos = ObjectMapper.Map<List<Tenant>, List<SaasTenantDto>>(list);
    
        return new PagedResultDto<SaasTenantDto>(
            count,
            tenantDtos
        );
    }
    

    【讨论】:

    • 非常感谢,我试试看。有什么理由不用IIdentityUserRepository上的功能吗?
    • IIdentityUserRepository 中没有特定于租户的逻辑。如您所知,它只与用户有关。
    • 抱歉,Alper,我在回答不同的答案时搞混了。今晚我将执行你的建议。非常感谢。
    • 您好 Alper,抱歉,您的解决方案似乎仅适用于 ABP Commercial。不过还是谢谢。
    猜你喜欢
    • 1970-01-01
    • 2021-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-09
    • 1970-01-01
    • 2018-02-24
    • 1970-01-01
    相关资源
    最近更新 更多