2013-06-02 35 views
1

我正在開發一個用於教育目的的MVC框架。現在我被困在我應該如何處理框架中的事件。簡單依賴注入和解耦的事件處理

我一直在尋找的最接近的答案是Adding events to an interface/implementation,但它沒有說任何有關注射部分。

我的問題是,兩種方法都足夠好嗎?它們是分離的嗎?

該語言是PHP,但將其視爲僞代碼。

This 第一個例子是一種C#方法。 ClassA注入Kernel課程,並且訂閱該活動是它自己的責任。

class Kernel{ 
    public $onInit  = new EventHandler(); 
    public $onTerminate = new EventHandler(); 
    public function __construct(){ 
    } 
    public function boot(){ 
     //...dosomething 
     $this->onInit->raise($this, new EventArgs()); 
     $this->onTerminate->raise($this, new EventArgs()); 
    } 
} 
class ClassA{ 
    public function __construct($kernel){ 
     $kernel->onInit->add(array($this,'onKernelInit')); 
    } 
    public function onKernelInit($sender, $args){ 
     $this->doSomething($sender); 
    } 
    public function doSomething(Kernel $kernel){} 
} 

第二種方法是負責訂閱事件的中間類。 ClassAListener注入ClassAKernelEventDispatcher

class Kernel{ 
    public $dispatcher; 
    public function __construct(KernelEventDispatcher $dispatcher){ 
    $this->dispatcher = $dispatcher; 
    } 
    public function boot(){ 
    //do something... 
    $this->dispatcher->raiseInit($this, new EventArgs()); 
    $this->dispatcher->raiseTerminate($this, new EventArgs()); 
    } 
} 
class ClassAListener{ 
    public function __construct(ClassA $classA, KernelEventDispatcher $dispatcher){ 
    $this->classA = $classA; 
    $dispatcher->onInit(array($this, 'onKernelInit')); 
    } 
    public function onKernelInit($sender, $args){ 
    $classA->doSomething($sender); 
    } 
} 

我傾向於第二種方法,因爲它是乾淨多了,但我不知道是否「走出正確的方式」它(處理事件)。

任何幫助表示讚賞。

+0

+第二種方法。第一種方法在EventHandler上創建一個未發佈的依賴項......這個框架是否可供大衆或私人聽衆使用? – Orangepill

+0

現在我的框架的主要目標是學習新東西(我學到了很多;設計模式,依賴注入等)。我想讓它開源,但取決於我對結果(代碼)的滿意程度。並感謝您的意見。 – OsakaHQ

+0

使它開放源代碼......讓別人貢獻......它只會擴展學習...... – Orangepill

回答

1

我相信第二種方法更好,因爲第一種方法創建了對EventHandler實現的依賴關係,該實現並不立即顯而易見,並且很難進行擴展或替換。