3

我正在将应用程序从单租户移动到多租户。在此过程中,我将tenantId 添加到所有必需的模型并更新了数据库(实体框架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,以便我可以从模型项目和我的所有存储库中访问它?

4

1 回答 1

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 中,因此我可以根据请求尽可能频繁地访问租户,并且不会遇到任何性能问题。

如果每个用户都有一个自定义租户,这不是问题,因为您只需更改界面即可。您还可以添加更复杂的逻辑,例如在我的前端中,租户由 url 定义,而在管理区域中,租户 ID 有一个路由参数。

于 2013-08-03T10:01:37.853 回答