[英]Access TenantId in Model Project in ASP.NET MVC
我正在将应用程序从单租户转移到多租户。 在此过程中,我将tenantId添加到所有必需的模型并更新了数据库(Entity Framework 5)。
但是,我有所有需要更新的存储库。 首先,我不知道如何在Model Project中获取当前用户id(然后是tenantId)(不依赖于WebSecurity,没有httpContext)。
其次,我不想在我的所有控制器中执行这个丑陋/昂贵的代码。 (获取UserId,进行数据库调用以获取tenantId,然后将其传递给Repository。)
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,我可以从模型项目和我的所有存储库访问它?
我将解析租户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中,因此我可以根据需要随时访问租户,并且不会遇到任何性能问题。
如果每个用户都有自定义租户,那么这不是问题,因为您只需更改界面即可。 您还可以添加更复杂的逻辑,例如在我的前端,租户由url定义,在admin-area中,有一个tenant-id的route-parameter。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.