1

教育目的で MVC フレームワークを開発しています。今、フレームワークでイベントをどのように処理すればよいか悩んでいます。

私が探していた最も近い答えは、インターフェース/実装へのイベントの追加でしたが、注入部分については何も述べていません。

私の質問は、両方のアプローチで十分ですか? それらは切り離されていますか?

言語は PHP ですが、疑似コードとして扱います。

この最初の例は、一種の 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){}
}

この 2 番目のアプローチでは、イベントのサブスクライブを担当する中間クラスがあります。ClassAListenerと が注入されClassAますKernelEventDispatcher

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);
  }
}

私は 2 番目のアプローチの方がずっとクリーンなので傾いていますが、それが「正しい方向に進んでいる」(イベントの処理) かどうかはわかりません。

どんな助けでも大歓迎です。

4

1 に答える 1

1

最初のアプローチは EventHandler の実装への依存関係を作成するため、2 番目のアプローチの方が優れていると思います。

于 2013-06-02T04:19:00.363 に答える