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

时间:2013-08-02 22:31:00

标签: c# asp.net-mvc multi-tenant

我正在将应用从单租户转移到多租户。在此过程中,我将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,我可以从模型项目和我的所有存储库访问它?

1 个答案:

答案 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的路​​由参数。