在不同的服务中使用对象的子集



假设我有一个严重依赖于单个对象的系统,例如Person。我有一个存储服务(服务1),它处理Person的基本CRUD操作,并将这个人保存在蒙古包中。但是这个Person对象非常大而且嵌套,它有很多属性,其中一些对其他一些服务是不相关的。例如,我们有一个服务2,它从存储服务中获取一个Person对象,并在ui中呈现它,他只关心一些属性,不需要整个大的和嵌套的Person对象。我们有一个服务3,它从存储服务中获取一个Person对象,它需要一个不同于服务2的属性子集。

我们正在使用。net,所以所有东西都是强类型的。直接的解决方案是在每个服务中定义Person类的子集,并使用一些转换器将Person对象转换为该服务所需的对象(删除不相关的属性)。但是有些服务除了需要5-10个属性外,还需要Person对象,正如我所说,Person是一个巨大的嵌套对象。

这个场景的最佳实践是什么?我们不想为每个服务及其相关属性重新定义一个新的"迷你人",因为这感觉像是巨大的代码重复+在每个服务和存储服务之间创建了沉重的依赖关系。但是我们使用的是。net,所以我们必须有一些强类型的对象,否则我们将无法对从存储服务接收到的对象进行任何操作,因为我们不想将其作为纯json使用,只是遍历键。

我们想到了两种解决方案:第一种是在所有服务之间使用相同的Person对象。每个服务都将获得person obj,因此它需要的任何操作,然后使用自定义序列化器序列化它,该序列化器从json中删除一些键,这样获得响应的人将只获得相关的props。第二种是在props中添加一些注释,说明"如果请求来自服务2,那么做json忽略",并且不要在存储服务的返回值中序列化这个prop。但是这使得存储服务不是孤立的和简单的,这样在服务2中我们又不能反序列化和操作对象,因为我们没有强类型的"迷你人",所以我们必须使用json.

对于这种情况有没有更好的解决方案?再说一遍,这是在Person对象非常大并且需要大量工作的假设下进行的,一次又一次地重新定义它,并将创建大量依赖。

谢谢。

如果我们讨论的是最佳实践,也许Person对象一开始就不应该变得这么大。你总是可以将嵌套的数组和对象拆分到它们各自独立的文件、实体或mongo集合中。

但就目前情况而言,也许你可以使用dynamic或dictionary <string,>而不是创建Person类型并映射该类中的每个强类型字段。

using System.Dynamic;
var person_from_database = person_repository.GetById(1);
dynamic person_result = new ExpandoObject();
person_result.name = person_from_database.fullname; //declare whatever properties your services need
person_result.first_address = person_from_database.addresses[0]; //even nested arrays and objects
person_result.name = person_result.name.ToUpper(); //modify values if needed
return Ok(person_result); //return whatever, no mapping

更多细节在这里!

最新更新