繁体   English   中英

访问ASP.NET MVC中的模型项目中的TenantId

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM