2017-06-22 201 views
2

我有如下代碼:訪問示例以外的類方法實例的正確方法是什麼?

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實例。

,我不知道如何從myStuff()

+0

使'數據庫''共享'並將其移動到模塊範圍? –

回答

0

我有vibe.d沒有經驗去DB方法訪問,但是這可能是一個解決方案的問題:

Database database; 

shared static this(){ 
    Config config = new Config(); 
    database = new Database(config); 
} 

void main(){ 
(...) 

void myStuff(HTTPServerRequest req, HTTPServerResponse res){ 
    database.whatever; 
} 
1

有不嘗試過,但使用「部分」可能是一個解決方案。

https://dlang.org/phobos/std_functional.html#partial

void myStuff(Database db, HTTPServerRequest req, HTTPServerResponse res) { ... } 

void main() 
{ 
    import std.functional : partial; 

    ... 
    router.get("*", partial!(myStuff, database)); 
    ... 
} 

部分創建了綁定到一個給定值的第一個參數的函數 - 這樣的調用者不需要了解它。我個人不喜歡全局變量/,單身/等,並嘗試注入依賴項。雖然實現可能會變得更加複雜,但這確實簡化了很多測試。

https://en.wikipedia.org/wiki/Dependency_injection#Constructor_injection

當注入依賴這樣你也可以得到有關所需組件的快速概述調用這個函數:

上面的例子這裏提到注入類似構造器注入方式的依賴。如果使用其他方法增加依賴關係的數量 - 例如。注入一個ServiceLocator。

https://martinfowler.com/articles/injection.html#UsingAServiceLocator

羅尼

1

作爲一種替代的部分,你可以用closure實現partial application

router.get("*", (req, resp) => myStuff(database, req, resp)); 

// ... 

void myStuff(Database db, HTTPServerRequest req, HTTPServerResponse res) 

// ... 

myStuff現在已經從周邊範圍注入database

+0

正確,比部分更好! – duselbaer

相關問題