【问题标题】:.Net Core API same url different tenant payload.Net Core API 相同的 url 不同的租户有效负载
【发布时间】:2020-12-04 17:49:44
【问题描述】:

我正在处理一个不完全是多租户的项目,但我们有多个使用本地应用程序的客户,其中一项要求是为所有这些客户提供一个代码库。目前,每个客户要么拥有原始代码库的一个分支,要么在公共存储库上拥有一个特殊分支。 多年来,自定义代码是他们每个人的模式,这导致数据库、业务逻辑和前端的差异。

对于我们正在构建的 REST API,我试图找到一种干净的方法来为每个客户端使用相同的 url,但有效负载也可能会有所不同。我需要能够根据配置调用适当的控制器。 对于 clientA,POST /api/visitor 的有效载荷形状可能是 {Name, Age},clientB 可能是 {Name, CardNumber, Height}。

我尝试在解决方案中将控制器移动到它们自己的项目中并使用 AddApplicationPart(clientAssembly),但是由于在 api 项目中引用了所有项目,endpoints.MapControllers() 由于名称冲突而崩溃。如果我完成这项工作,由于项目引用,它需要为每个客户部署代码,我认为这不是一个好主意。

我还研究了使用新的 .net core 3 动态路由功能,但我认为它应该用于转换请求而不是为其添加上下文。

有人遇到过这个吗?我是否应该跳过所有这些并在每条路由的 URL 中包含“租户”(此解决方案可能会被拒绝)?

【问题讨论】:

    标签: .net .net-core architecture multi-tenant


    【解决方案1】:

    您可以尝试创建多个版本的 API。下面是一个非详尽的示例,但可以将您的问题映射到解决方案域。这将帮助您使您的域、api 和服务与映射到它们自己的版本共存。同样在以后的某个时间点,您可以将旧版本的 API 使用者迁移到最新版本并停止维护非常旧的版本(例如过时)。我们今天在网络上发布的大多数公共 API 都遵循这种模式。

    namespace Models.V1.Customer {
        public class Customer {
    
            public Guid Id;
            public string Name;
            public string Address;
            public int Zip;
        }
    }
    
    namespace Models.V2.Customer {
        public class Customer: Models.V1.Customer {
            public Location CustomerLocation;
        }
    }
    
    
    [RoutePrefix("api/customers/")]
    public class CustomerAPIController : IHttpController {
    
        [Route("v1/byId/{Id}")]
        public Models.V1.Customer GetCustomerById(Guid Id) {
            // calls to get the customer data by id
        }
    
        [Route("v2/byId/{Id}")]
        public Models.V2.Customer GetCustomerById(Guid Id) {
            // calls to get the customer data by id
        }
    }
    

    您可以从here 阅读有关此主题的更多信息

    希望这可以澄清您的问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-13
      • 1970-01-01
      • 2018-07-09
      • 1970-01-01
      • 1970-01-01
      • 2018-04-05
      • 1970-01-01
      • 2019-05-29
      相关资源
      最近更新 更多