我使用一个 Web 服务 API,它可以通过一个通用类型的Result
s 来提供某些基本信息,尤其是一个唯一的 ID。该唯一 ID 往往是——但不是必须——UUID
由发送者定义,发送者并不总是同一个人(但 ID 在整个系统中是唯一的)。
从根本上说,API 的结果与此类似(用 Java 编写,但语言应该无关紧要),其中只有基本接口代表常见细节:
interface Result
{
String getId();
}
class Result1 implements Result
{
public String getId() { return uniqueValueForInstance; }
public OtherType1 getField1() { /* ... */ }
public OtherType2 getField2() { /* ... */ }
}
class Result2 implements Result
{
public String getId() { return uniqueValueForInstance; }
public OtherType3 getField3() { /* ... */ }
}
需要注意的是,每种Result
类型可能代表一种完全不同的信息。其中一些不能与其他Result
s 相关,而其中一些可以,无论它们是否具有相同的类型(例如,Result1
可能能够与 相关Result2
,因此反之亦然,但有些ResultX
可能存在无法相关,因为它表示不同的信息)。
我们目前正在实现一个系统,该系统接收其中一些Result
s 并在可能的情况下将它们关联起来,从而生成一个不同的Result
对象,该对象是它关联在一起的内容的容器:
class ContainerResult implements Result
{
public String getId() { return uniqueValueForInstance; }
public Collection<Result> getResults() { return containedResultsList; }
public OtherType4 getField4() { /* ... */ }
}
class IdContainerResult implements Result
{
public String getId() { return uniqueValueForInstance; }
public Collection<String> getIds() { return containedIdsList; }
public OtherType4 getField4() { /* ... */ }
}
这是两个容器,它们呈现不同的用例。第一个,ContainerResult
允许某人接收相关的详细信息以及实际完整的相关数据。第二个,IdContainerResult
通过仅发送关联的 ID 来牺牲完整列表以支持带宽。进行关联的系统不一定与客户端相同,并且客户端可以接收Result
这些 ID 将代表的 s,这旨在允许他们通过简单地接收 ID 在其系统上显示相关性。
现在,我的问题对某些人来说可能并不明显,而对其他人来说可能很明显:如果我只发送 ID 作为 的一部分IdContainerResult
,那么如果客户Result
没有单个 ID 存储?每个实现实际表示的数据类型Result
在它们无法关联时会被隔离,这意味着在大多数情况下,如果不增加内存或存储负担,单个 ID 存储是不可能的。
我们提出的当前解决方案需要创建一种新类型的 ID,我们将其命名为TypedId
,它将 XML 命名空间和 XML 名称与每个Result
的Result
ID 结合起来。
我对该解决方案的主要问题是,它需要维护一个可变的类型集合,这些类型在发现时会更新,或者需要所有类型的先验知识,以便 ID 可以在任何客户端的系统上正确关联。不幸的是,我想不出更好的解决方案,但目前的解决方案感觉不对。
有没有人遇到过类似的情况,他们希望将 genericResult
与其原始类型相关联,特别是考虑到 WSDL 的限制,并以更简洁的方式解决它?