【问题标题】:Access TenantId in Model Project in ASP.NET MVC在 ASP.NET MVC 的模型项目中访问 TenantId
【发布时间】:2013-08-03 18:01:37
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    我会将租户 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 有一个路由参数。

    【讨论】:

    • 是的,我认为这就是我正在寻找的解决方案类型。那么您是否将其填充到 global.asax session_start 中?如果它是 httpContext 的一部分,它是如何传递给 Model 项目的?
    • 我使用 unity 作为依赖注入框架,但你也可以手动创建租户提供者并将其传递给你的模型。会话开始时无需设置任何内容,您只需创建一个新实例并将租户提供程序传递给您的模型,例如在控制器中。每个请求计算一次租户。
    • 我将不得不学习依赖注入。无论如何,我一直想做的事情。感谢您的指导!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多