D 访问范围外的类方法实例的正确方法是什么?
我有以下代码:D 访问范围外的类方法实例的正确方法是什么?,d,vibed,D,Vibed,我有以下代码: import std.stdio; import database; import router; import config; import vibe.d; void main() { Config config = new Config(); auto settings = new HTTPServerSettings; settings.port = 8081; settings.bindAddresses = ["::1", "127.
import std.stdio;
import database;
import router;
import config;
import vibe.d;
void main()
{
Config config = new Config();
auto settings = new HTTPServerSettings;
settings.port = 8081;
settings.bindAddresses = ["::1", "127.0.0.1"];
auto router = new URLRouter();
router.get("/*", serveStaticFiles("./html"));
Database database = new Database(config);
database.MySQLConnect(); // all DB methods are declared here
router.registerRestInterface(new MyRouter(database));
router.get("*", &myStuff); // all other request
listenHTTP(settings, router);
logInfo("Please open http://127.0.0.1:8081/ in your browser.");
runApplication();
}
void myStuff(HTTPServerRequest req, HTTPServerResponse res) // I need this to handle any accessed URLs
{
writeln(req.path); // getting URL that was request on server
// here I need access to DB methods to do processing and return some DB data
}
我需要创建router.get(“*”,&myStuff)
处理与任何REST实例无关的任何URL
我不知道如何从
myStuff()
访问DB方法的问题我没有使用vibe.d的经验,但这可能是一个解决方案:
Database database;
shared static this(){
Config config = new Config();
database = new Database(config);
}
void main(){
(...)
void myStuff(HTTPServerRequest req, HTTPServerResponse res){
database.whatever;
}
尚未尝试过,但使用“部分”可能是一个解决方案 Partial创建一个函数,第一个参数绑定到一个给定的值,因此调用方不需要知道它。就我个人而言,我不喜欢globals/和singleton/等,并尝试注入依赖项。尽管实现可能会变得更复杂一些,但这确实大大简化了测试 上面的示例以类似于此处提到的构造函数注入的方式注入依赖项: 当像这样注入依赖项时,您还可以快速了解调用此函数所需的组件。如果依赖项的数量增加,请考虑使用其他方法-例如注入ServiceLocator
Ronny作为部分替代方案,您可以通过以下方式实现:
myStuff
现在已经从周围的作用域中注入了数据库
。使数据库
共享,并将其移动到模块作用域?对,比部分更好!
void myStuff(Database db, HTTPServerRequest req, HTTPServerResponse res) { ... }
void main()
{
import std.functional : partial;
...
router.get("*", partial!(myStuff, database));
...
}
router.get("*", (req, resp) => myStuff(database, req, resp));
// ...
void myStuff(Database db, HTTPServerRequest req, HTTPServerResponse res)
// ...