背后的故事:
我在ConnectionString
类中添加了新字段Tenant
。
我也更改了TenantCacheItem.CustomData
,因此也可以从缓存中使用新的ConnectionString
。
我已经创建了自己的MyDbPerTenantConnectionStringResolver: DbPerTenantConnectionStringResolver
,因此它包含获取"MyNewConnectionString"
的新方法。如果是主机,则MyDbPerTenantConnectionStringResolver
会引发异常。
现在,我必须创建自己的存储库(它不是EF存储库,而是自定义存储库)。并且该存储库应从"MyNewConnectionString"
中提取Tenant
。
我知道Tenant
可以提供AbpSession
信息。但我不知道应如何以及何时将AbpSession
发送到MyRepository
。
可能我必须在IAbpSession
构造函数中添加MyRepository
,但是如何设置呢?谁设置AbpSession
以及何时AbpSession
真正获得价值?
如果我了解这在ASP.NET Boilerplate的DbContext
中是如何工作的,那么我可以在自己的存储库中重新创建相同的逻辑。
答案 0 :(得分:2)
可能我必须在MyRepository构造函数中添加IAbpSession,但是如何设置它?
您可以属性注入IAbpSession
:
public class MyRepository : ITransientDependency
{
public IAbpSession AbpSession { get; set; }
public MyRepository()
{
AbpSession = NullAbpSession.Instance;
}
}
谁设置AbpSession,以及何时设置AbpSession实际获得价值?
IAbpSession
由ClaimsAbpSession
实现为单例。
它的属性是吸气剂。例如:
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;
}
}