如何在嵌入式UNIX系统中抽象网络服务API

时间:2015-04-19 18:00:21

标签: c design-patterns embedded abstract

我正在使用嵌入式LINUX系统来处理路由器。有一个Web GUI供用户配置选项。当用户填写Web表单时,会将其提交给负责验证用户输入的Web服务器功能,将配置保存在数据库中并使用C标准库和bash脚本重新启动某些服务。有一个命令行界面也可以通过SSH调用。此CLI再次验证用户输入,将配置保存到数据库中,并使用bash脚本重新启动某些服务。

我想将一些业务逻辑抽象为更具凝聚力的层。例如,我想为DHCP服务器使用抽象数据类型。 ADT接口将通过概念实体公开操作(启动/停止服务,设置IP地址池以提供给LAN客户端)并隐藏操作实现细节(设置DHCP服务器的脚本)。

为DHCP服务器提供这段ADT:

static int enable;
static struct in_addr lan_ip_pool_start;
static struct in_addr lan_ip_pool_end;
static char* opt12_hostname;
.....

int DhcpServerStart ()
{
    ....
    ....
}

对于上面的方法,它可以在调用时更新enable变量,更新数据库并实现代码fork和执行DHCP Server二进制文件并传递正确的参数。 但我认为通过抽象更多不相关的责任来获得更多的好处。

所以我想使用新的API抽象数据库,也许我可以使用另一个API抽象shell脚本。这样我就可以迁移数据库和脚本而无需更改域对象的实现:

#include <databaseapi.h>
#include <shellcfg.h>

static int enable;
static struct in_addr lan_ip_pool_start;
static struct in_addr lan_ip_pool_end;
static char* opt12_hostname;
.....

int DHCPServerStart ()
{
    database_saveDHCPServerState(1);
    shell_DHCPServerStart();
}

我对上述方法一点都不满意。我认为更新数据库不是DHCP服务器作为概念对象应该处理的事情。同时我不确定是否应该抽象shell脚本来设置网络服务,或者它应该由代表业务特定实体的每个ADT实现。

另一方面,当系统启动时,处理系统初始化的功能将实例化所有业务实体,因此我正在考虑将所有实体包含在全局&#39; /#ADT中。也许这个班级&#39;可以公开一个让用户界面设置任何服务的接口,然后这个全局对象应该注意更新数据库并使用代表服务的特定ADT来启动一些服务。

0 个答案:

没有答案