【发布时间】:2013-01-31 00:59:24
【问题描述】:
我正在用 C++ 编写一个长时间运行的多线程服务器。它在套接字上接收请求,进行数据库查找并在套接字上返回响应。
服务器从配置文件中读取各种运行信息,包括数据库连接参数。我必须使用公司代码库中的数据库抽象类。我不想等到尝试进行数据库搜索以延迟实例化数据库连接(由于未显示复杂性以及如果无法建立数据库连接,则需要在启动时出错退出)。
我的问题是如何将数据库连接信息放到搜索类中,而不需要做任何技术上可行的“丑陋”或糟糕的 OOP 事情。我想学习如何正确地做到这一点。
有没有很好的设计模式来做这件事?我应该使用“从上方参数化”模式吗?我错过了一些更简单的组合模式吗?
// Read config file.
// Open DB connection using config values.
Server::process_request(string request, string response) {
try {
Process process(request);
if (process.do_parse(response)) {
return REQ_OK;
} else {
// handle error
}
} catch (..,) {
// handle exceptions
}
}
class Process : public GenericRequest {
public:
Process(string *input) : generic_process(input) {};
bool do_parse(string &output);
}
bool Process::do_parse(string &output) {
// Parse the input request.
Search search; // database search object
search.init( search parameters from parsing above );
output = format_response(search.get_results());
}
class Search {
// must use the Database library connection handle.
}
如何将数据库连接从顶部的 Server 类获取到上面伪代码底部的 Search 类实例?
【问题讨论】:
-
你应该展示你拥有的当前类层次结构,也许还有一些更相关的方法。但不要显示方法实现,因为它们与面向对象的设计无关。
-
您的服务器是应用程序中的单例吗?
-
@user1610015 实际上了解每种方法的目的是很有用的,并且显示一些突出显示方法要点的代码很好地服务于该目的,恕我直言。
-
@didierc 是的,它是执行此功能的多个服务器中唯一的一个,这是线程化的原因之一。
标签: c++ oop design-patterns database-connection parameterization