我正在将应用从单租户转移到多租户。在此过程中,我将tenantId添加到所有必需的模型并更新了数据库(Entity Framework 5)。
但是,我有所有需要更新的存储库。首先,我不知道如何在模型项目中获取当前用户ID(然后是tenantId)(不依赖于WebSecurity,没有httpContext)。
其次,我不想在所有控制器中执行这个丑陋/昂贵的代码。 (获取UserId,进行数据库调用以获取tenantId,然后将其传递给存储库。)
public class PinTypeController : BaseController
{
private PinTypeRepository pinTypeRepo;
public PinTypeController()
{
UserRepository userRepo = new UserRepository();
UserProfile user = userRepo.GetById(WebSecurity.CurrentUserId);
this.pinTypeRepo = new PinTypeRepository(user.TenantId);
}
public ActionResult Index()
{
vmPinType vm = new vmPinType();
vm.NewPinType = new PinType();
vm.PinTypes = pinTypeRepo.GetAll();
return View(vm);
}
}
有没有更好的方法来存储tenantId,我可以从模型项目和我的所有存储库访问它?
答案 0 :(得分:6)
我会从其他代码中解析租户ID的来源,例如,您可以支持多个域,其中一个租户映射到域。
在我的项目中,我定义了一个接口
interface ITenantProvider
{
Tenant Tenant { get; }
}
实施:
class TenantProvider : ITenantProvider
{
Tenant Tenant
{
get
{
Tenant tenant = HttpContent.Current.Items["Tenant"] as Tenant;
if (tenant == null)
{
string domain = GetDomain();
tenant = TenantRepository.GetTenantByDomain(domain);
HttpContext.Current.Items["Tenant"] = tenant;
}
return tenant;
}
}
}
我将租户缓存在items-dictionary中,因此我可以根据需要随时访问租户,并且不会遇到任何性能问题。
如果每个用户都有自定义租户,那么这不是问题,因为您只需更改界面即可。您还可以添加更复杂的逻辑,例如在我的前端,租户是由网址定义的,在管理区域中,有一个租户ID的路由参数。