gpt4 book ai didi

c# - 在 ASP.NET MVC 模型项目中访问 TenantId

转载 作者:行者123 更新时间:2023-11-30 14:32:43 26 4
gpt4 key购买 nike

我正在将一个应用程序从单租户转移到 Multi-Tenancy 。在此过程中,我将 tenantId 添加到所有必需的模型并更新了数据库 (Entity Framework 5)。

但是,我有所有需要更新的存储库。首先,我不知道如何在模型项目中获取当前用户id(然后是tenantId)(不依赖于WebSecurity,没有httpContext)。

其次,我不想在我的所有 Controller 中都执行这种丑陋/昂贵的代码。 (获取 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)

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

关于c# - 在 ASP.NET MVC 模型项目中访问 TenantId,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18027060/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com