我目前正在开发一个多租户系统,我已经实现了混合流程,该流程允许每个客户同时使用单个数据库,并根据请求实现共享数据库,
但是,某些客户需要一些定制,因为它们的流程略有不同,但我只有一个跨系统的用户流。
如何在不影响系统中其他客户的情况下为客户实现此自定义?
请看我现在的架构

编辑:定制主要是与用户旅行相关的系统,客户A希望将薪资发送给MD以供批准,而客户B希望会计在MD之前批准。
发布于 2021-12-17 12:30:46
如果我们说的是数据库。
我要做的是为他们的定制添加一个json类型的对象。
类似于添加一个custom_fields列
Customer Table
//your properties
custom_fields : nvarchar(max)带样本值
custom_fields
NULL //for customers without custom_fields
{"CustomFieldA" : "ValueForA", "CustomFieldB" : "ValueForB"} \\for customers with specific request然后在c#端,在动态对象或确定的类上对其进行去功能化。
//if not determined
var customField = JsonSerializer.Deserialize<ExpandoObject>(jsonString);然后访问该值
foreach (var key in customField.Select(x => x.Key))
{
//to get the custom property name
var propertyName = key.ToString();
//to get the value
var value = customField.First(x => x.Key == key).Value;
}发布于 2021-12-17 14:52:29
从高层角度来看,在运行在同一模式上的多租户解决方案中,我们可以通过严格为所有租户(而不仅仅是那些请求更改的租户)应用所有模式更改来解决许多问题。
如果您可以避免这种情况,甚至不要考虑动态模式,而是改进产品,以便所有租户都能享受到好处,并减少那些过于困难或与核心产品不一致的请求。 说不做是可以的(或者要求收取猥亵费以使其值得一试)
诀窍是以向后兼容的方式实现任何更改,如果类获得新属性,但不希望所有租户自动使用这些属性,则使用继承来扩展类,如果引入了新的关系,则使它们成为可选的。如果您已经充分地将表示层与数据模型分离,那么保持以前的视图不使用新属性并有效地蒙蔽任何需要新属性的视图不应该有任何问题。
如果您的域模型可以抽象成有效的文档管理,那么主要的流程管理和配置方面就不需要知道特定的租户业务模型,只有抽象的,在这种情况下,可以使用JSON或如本答复所述序列化技术。
这方面的一个很好的例子是第三方物流或经纪应用程序中的托运、清单和采购订单,域模型仅通过一组公共标识符和几个公共描述字段绑定到松散跟踪的托运货物和行项,但原始内容可以序列化并存储到数据库中的单个字段中,因为大多数数据和处理操作不需要知道特定内容或其结构。 这在3PL中经常出现,因为使用不同数据平台和软件的不同运营商在发送端和接收端都与客户进行交互,在at之间可能涉及多个实体,但这些实体在实际飞行过程中没有任何数据所有权或修改该数据的权限。 数据的生命周期包括摄入、多阶段处理、通知和某种形式的出口。在摄入时,我们应用特定的转换来解释标准模式需要从数据中知道什么,但是对于其他所有东西,通常可以接受以它的本机形式查看序列化的内容,这意味着对于每一个自定义的数据类型,都会有一个对标准模型的相应转换,以及一个可以呈现本机表单的视图。
如果唯一的更改是在数据处理的编排中,那么除了流程步骤的配置和一些状态管理之外,实际上不需要太多的模式更改来实现。
出现在脑海中的可能的编排解决方案是Azure函数、Azure持久函数、Logic或其他工作流引擎。即使您已经拥有可以执行各种任务和操作的核心API或代码库,您仍然可以使用工作流技术来基于配置的触发器执行这些端点。
您还可以研究一种用于处理数据的更微观服务风格的体系结构,从模式的角度来看,web钩子或域事件可能会有所帮助,请在领域驱动设计和微服务体系结构中的领域事件与集成事件上阅读。
https://stackoverflow.com/questions/70393088
复制相似问题