|
| 1 | +--- |
| 2 | +sidebar_position: 4 |
| 3 | +--- |
| 4 | + |
| 5 | +# Inject 注入 |
| 6 | +- Server 啟動時會 觸發 `onServerStartEvent` |
| 7 | +- 如果我的 擴充 想在 `onServerStartEvent` 前做些什麼 ( 通常是自製的 `日誌擴充` 等 需要在其他擴充前 初始化完成 ) |
| 8 | +- 這時 `Inject 注入` 就登場了 |
| 9 | +- 注入新的 `onServerStartEventForExample` 讓其在 `onServerStartEvent` 前 先被執行 |
| 10 | +:::danger |
| 11 | +- 應謹慎使用 `Inject 注入` ,因其會破壞原生方法。 |
| 12 | +- 使用 `Inject 注入` 的擴充,應在 README 中註明,提醒使用者。 |
| 13 | +::: |
| 14 | +:::note |
| 15 | +- 使用了 `Inject 注入` 的案例 [`color_log`](https://github.com/ExpTechTW/CDPS-color_log)。 |
| 16 | +::: |
| 17 | + |
| 18 | +## 原始 類(class)、方法(function) |
| 19 | +- `cdps/plugin/events.py` |
| 20 | +```py |
| 21 | +class onServerStartEvent(Event): |
| 22 | + """ 當 伺服器 啟動 """ |
| 23 | + |
| 24 | + def __init__(self, pid): |
| 25 | + self.pid = pid |
| 26 | +``` |
| 27 | +- `cdps/cdps_server.py` |
| 28 | +```py |
| 29 | +def on_start(self): |
| 30 | + self.event_manager.call_event(onServerStartEvent("start")) |
| 31 | +``` |
| 32 | +## 定義新的類 |
| 33 | +```py |
| 34 | +from cdps.plugin.events import Event |
| 35 | + |
| 36 | +class onServerStartEventForExample(Event): |
| 37 | + """ 當 伺服器 啟動 """ |
| 38 | + def __init__(self, pid): |
| 39 | + self.pid = pid |
| 40 | +``` |
| 41 | +## 保留原始方法 |
| 42 | +```py |
| 43 | +original_on_start = cdps.cdps_server.CDPS.on_start |
| 44 | +``` |
| 45 | +## 定義新方法 |
| 46 | +```py |
| 47 | +def _new_on_start(self): |
| 48 | + self.event_manager.call_event(onServerStartEventForExample("example")) # 多了這行 |
| 49 | + original_on_start(self) # 呼叫原始方法 |
| 50 | +``` |
| 51 | +## 注入 |
| 52 | +```py |
| 53 | +cdps.cdps_server.CDPS.on_start = _new_on_start |
| 54 | +``` |
| 55 | + |
| 56 | +## 完成看起來像這樣 |
| 57 | +```py |
| 58 | +from cdps.plugin.manager import Manager , Listener |
| 59 | +from cdps.plugin.events import Event |
| 60 | +import cdps.cdps_server |
| 61 | + |
| 62 | +class onServerStartEventForExampleEvent(Event): |
| 63 | + """ 當 伺服器 啟動 """ |
| 64 | + def __init__(self, pid): |
| 65 | + self.pid = pid |
| 66 | + |
| 67 | +original_on_start = cdps.cdps_server.CDPS.on_start |
| 68 | + |
| 69 | +def _new_on_start(self): |
| 70 | + self.event_manager.call_event(onServerStartEventForExampleEvent("example")) |
| 71 | + original_on_start(self) |
| 72 | + |
| 73 | +cdps.cdps_server.CDPS.on_start = _new_on_start |
| 74 | + |
| 75 | +class onServerStartEventForExampleListener(Listener): |
| 76 | + event = onServerStartEventForExampleEvent |
| 77 | + |
| 78 | + def on_event(self, event): |
| 79 | + print(event.pid) |
| 80 | + |
| 81 | +event_manager = Manager() |
| 82 | +event_manager.register_listener(onServerStartEventForExampleListener()) # 別忘了監聽事件 |
| 83 | +``` |
0 commit comments