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

使用第二种方法,有一个中间类负责订阅事件。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);
  }
}

我倾向于第二种方法,因为它更干净,但我不确定它是否“走对了路”(处理事件)。

任何帮助表示赞赏。

4

1 回答 1

1

我相信第二种方法更好,因为第一种方法创建了对 EventHandler 实现的依赖,这种依赖并不立即显而易见,而且很难扩展或替换。

于 2013-06-02T04:19:00.363 回答