依賴注入容器常見的幾種方式
- 建構子注入(Constructor Injection
- Setter注入(Setter Injection)
- 介面注入(Interface Injection)
建構子注入
建構子注入必須在建立物件實體時就進行注入。
class Application { private $auth; private $session; public function __construct(Auth $auth, Session $session) { $this->auth = $auth; $this->session = $session; } // ...程式... } $auth = new Auth('localhost', 'root', ''); $session = new Session(); $application = new Application($auth, $session); $application->login('admin', 'admin');
Setter注入
Setter注入則是可以在物件實體建立後才透過 setter 函式來進行注入。
class Application { private $auth; private $session; public function SetAuth(Auth $_oAuth) { $this->auth = $_oAuth; } public function SetSession(Session $_oSession) { $this->session = $_oSession; } // ...程式... } $auth = new Auth('localhost', 'root', ''); $session = new Session(); $application = new Application(); $application ->SetAuth($auth); $application ->SetSession($authsession); $application->login('admin', 'admin');
介面注入
透過Interface去實作Setter。
interface Setter { public function SetAuth(Auth $_oAuth); public function SetSession(Session $_oSession); } class Application implements Setter { private $auth; private $session; public function SetAuth(Auth $_oAuth) { $this->auth = $_oAuth; } public function SetSession(Session $_oSession) { $this->session = $_oSession; } // ...程式... } $auth = new Auth('localhost', 'root', ''); $session = new Session(); $application = new Application(); $application ->SetAuth($auth); $application ->SetSession($authsession); $application->login('admin', 'admin');
何種比較好?
常見的建構元注入跟Setter注入哪種比較好?
It’s important to support both mechanisms, even if there’s a preference for one of them.
—— Martin Fowler
即使你有較偏好的選擇,同時支持這兩種機制都是必要的。
interface Setter { public function SetAuth(Auth $_oAuth); public function SetSession(Session $_oSession); } class Application implements Setter { private $auth; private $session; public function __construct(Auth $auth, Session $session) { $this->auth = $auth; $this->session = $session; } public function SetAuth(Auth $_oAuth) { $this->auth = $_oAuth; } public function SetSession(Session $_oSession) { $this->session = $_oSession; } // ...程式...