如何以及何时设置AbpSession?

时间:2018-06-21 07:22:02

标签: c# .net aspnetboilerplate

背后的故事:

  • 我在ConnectionString类中添加了新字段Tenant

  • 我也更改了TenantCacheItem.CustomData,因此也可以从缓存中使用新的ConnectionString

  • 我已经创建了自己的MyDbPerTenantConnectionStringResolver: DbPerTenantConnectionStringResolver,因此它包含获取"MyNewConnectionString"的新方法。如果是主机,则MyDbPerTenantConnectionStringResolver会引发异常。

现在,我必须创建自己的存储库(它不是EF存储库,而是自定义存储库)。并且该存储库应从"MyNewConnectionString"中提取Tenant。 我知道Tenant可以提供AbpSession信息。但我不知道应如何以及何时将AbpSession发送到MyRepository

可能我必须在IAbpSession构造函数中添加MyRepository,但是如何设置呢?谁设置AbpSession以及何时AbpSession真正获得价值? 如果我了解这在ASP.NET Boilerplate的DbContext中是如何工作的,那么我可以在自己的存储库中重新创建相同的逻辑。

1 个答案:

答案 0 :(得分:2)

  

可能我必须在MyRepository构造函数中添加IAbpSession,但是如何设置它?

您可以属性注入IAbpSession

public class MyRepository : ITransientDependency
{
    public IAbpSession AbpSession { get; set; }

    public MyRepository()
    {
        AbpSession = NullAbpSession.Instance;
    }
}
  

谁设置AbpSession,以及何时设置AbpSession实际获得价值?

IAbpSessionClaimsAbpSession实现为单例。

它的属性是吸气剂。例如:

public override long? UserId
{
    get
    {
        // ...

        var userIdClaim = PrincipalAccessor.Principal?.Claims.FirstOrDefault(c => c.Type == AbpClaimTypes.UserId);
        // ...

        long userId;
        if (!long.TryParse(userIdClaim.Value, out userId))
        {
            return null;
        }

        return userId;
    }
}