在库中强制执行后置条件

问题描述 投票:0回答:1

我正在创建一个唯一的 ID 生成器。我们称其为 -

UID service
(我们的库 - 第三方库),它有一个请求唯一 ID 的函数,例如
getUniqueIdentifier
,它会返回一个唯一 ID(假设我们的库 - 这个第 3 方库已经有所有配置(例如数据库凭据和其他硬编码在其中的内容)

会有客户请求此 UID 服务提供唯一 ID。客户端将使用这些 ID 在其自己的单独数据库中插入一些记录。

因此,假设当进行调用并从 UID 服务成功获取唯一 ID 时,客户端可以成功使用它插入数据库,否则插入可能会失败。

此外,假设还有另一个函数可以向 UID 服务返回标识符,以防在使用时发生故障。像

returnIdentifier(int id)

之类的东西

我的问题是,如何强制在插入数据库失败时自动返回失败的ID,这样客户端就不会错过手动添加回调部分的步骤。

oop design-patterns clean-architecture
1个回答
0
投票

如果服务及其客户端在进程外进行通信,正如评论者所暗示的那样,这将是一个非常非常困难的问题。

如果我们假设客户端代码通过普通方法调用与 UID 服务通信,那么我们可以使用 Command 对象并封装在

try/catch
块中。

因此,UID 服务可能会提供这样的方法(类似 C# 的伪代码):

public void WithId(IUidCommand cmd)
{
    var uid = // generate the UID here
    try
    {
        cmd.Use(uid);
    }
    catch // list the exceptions that you handle here
    {
        // recycle uid
        // rethrow?
    }
}

其中

IUidCommand
是一个接口:

public interface IUidCommand
{
    void Use(int uid);
}

或者,您可以将

Use
方法定义为返回
bool
的方法,并且如果命令返回
try/catch
,则让 UID 服务回收 ID,而不是使用
false

© www.soinside.com 2019 - 2024. All rights reserved.