2016-06-14 50 views
0

我想實現一個單線程應用程序,它還提供了一個插件/模塊API。我的應用程序使用在類方法中實例化/初始化的靜態io_service。它可能被某些人稱爲單身人士。將它提供給插件實現者是否是一個好主意?如何通過插件共享boost :: asio :: io_service [模塊]

boost::io_service& SomeClass::IOS() 
{ 
    static boost::io_service ios; 
    return ios; 
} 

首先我想允許插件只提供文件描述符和應用程序包裝它們作爲stream_descriptor對象,但是這會防止升壓提供的io_object特定功能;這就是我考慮將靜態io_service提供給插件實現者並將其限制爲僅使用io_object實例的原因。

+1

只要你的api包含boost asio頭文件,並且所有的插件都使用相同的#define,調試級別,ABI等進行編譯,那麼你會沒事的。總之,它可能會爲你工作,並失敗莫名其妙的別人。 –

+1

因爲這個原因,我會敦促你考慮把io_service包裝在一個公開的具體類(例如Dispatcher)中,它暴露'post'和'dispatch'(甚至可能是一個鏈的包裝)?'std :: function '。 –

回答

0

我認爲如果您的體系結構基於boost::asio,那麼直接將io_service作爲單身暴露就沒有問題。

有關ABI的問題對於每個C++插件架構 都是常見的,而不是針對boost::asio。 因此,包裝io_service(正如理查德所建議的)不是解決這個問題的辦法,而只是一種隱藏使用asio的決定的方法。

BTW:我想你想允許插件管理I/O通過asio,並且主要應用調度的任務,所以它不會滿足你的包裝,露出postdispatch(無用插件),你應該提供例如套接字和其他I/O方法。

+0

可能工廠方法的io_object實例將是可取的,而不是提供io_service對象作爲signleton – DaTroop

+0

@DaTroop你應該使用一個獨特的io_service實例每個應用程序,所以在這種情況下,一個工廠(任何種類)是不合適的。主應用程序應創建io_service實例並將其傳遞給插件。在這種情況下恕我直言,沒有真正的價值爲io_service編寫接口。 –

+0

我擔心的是暴露了io_service。因此,io_object實例的工廠將防止插件開發人員濫用io_service – DaTroop

相關問題