【问题标题】:Raise custom event in multi-project在多项目中引发自定义事件
【发布时间】:2010-07-29 08:58:06
【问题描述】:

它涉及以下内容:我有两个项目应该或多或少地相互独立存在。项目一是一种文件系统观察器。另一个是我的 UI。如果有新文件,文件观察程序会引发事件。之后,应将文件中的数据添加到数据库中。这大致是背景故事。实际的问题是,文件观察者引发事件后,我想通知 UI 更新数据的视图。这意味着,事件应该由文件观察程序引发,并且应该在 UI 的实现中注册事件。现在的主要问题是我需要来自两个项目的类的实例。显然这会导致循环依赖问题。 CP问题当然有接口的解决方案,但这并不能解决问题,我需要相同的对象来创建数据和事件注册。 希望你能帮助我解决这个问题。 谢谢。

【问题讨论】:

  • 为什么你的文件观察器需要你的 UI 中的类?

标签: c# .net events circular-dependency multi-project


【解决方案1】:

为什么您认为业务逻辑程序集中需要一个 UI 实例?

要注册事件处理程序,您通常只需要调用程序集的实例(观察者,已包含在调用程序集中)和引用程序集的实例(您的程序集包含文件系统观察程序)。

然后你有例如以下结构:

用逻辑组装

public class MyCustomWatcher
{   
    public event EventHandler Event;

    private void RaiseEventForWhateverReason()
    {
        if (Event != null)
        {
            Event(this, new Args());
        }
    }
   public Data GetData()
   {
    //return the data
   }
}

Assembly with UI: - 表单和控制器类型都在这里声明。

class Form : System.Windows.Forms.Form
{
 public void DisplayNotification(Data data)
 {
   //actual code here
 }
}

class Controller 
{
    private Form form;
    private MyCustomWatcher watcher;

    public void Init()
    {
      this.watcher = CreateWatcher();
      RegisterEvents();
      ShowForm();
    }
    void ShowForm()
    {
     //show
    }
    void RegisterEvents()
    {
        this.watcher.Event += HandleChange;
    }

    void HandleChange(object sender /*this will be the instance that raised the event*/, SomeEventArgs e)
    {
        //BTW: this.watcher == sender; //the same instance

        form.DisplayNotification(this.watcher.GetData());
    }
}

带有 UI 的程序集引用带有逻辑的程序集。这里没有循环依赖。

【讨论】:

  • 感谢您的示例。我已经意识到你的解决方案,但问题在于,像以前一样,在这一行:this.watcher = CreateWatcher();怎么可能创建一个观察者的实例,这在我在 RegisterEvents() 中注册了 evnet 并且我调用 watcher.RaiseEventForWhateverReason() 之后是相同的。这是我的主要问题。此外,应该以任何方式区分实例,因为观察者可以在短时间内接收到许多事件。
  • 观察者是一个字段。您分配它,它将保持指向同一个实例。正如我在示例中所指出的,sender 参数将是引发事件的实例 - 您只需将其转换并分配给一个局部变量:Watcher theSender = (Watcher)sender。如果您有多个实例,这将对您有所帮助。
【解决方案2】:

我不确定我是否理解为什么 FileWatcher 会对你的 UI 有任何依赖,但既然你说它确实如此,那么你可以添加第三个项目作为两者之间的 event aggregator .这将使两个项目都依赖于聚合器,但会删除彼此的依赖关系。

【讨论】:

  • 对不起,我解释得不够清楚。 UI 不需要任何依赖:也许我可以用几行代码澄清我的问题: FileWatcher: Recording rec = new Recording(); rec.NotifyUI(); UI:录音拍=新录音; pat.RecordingStarted += listview.UpdateList; Recording 是 FW 项目中的一个类,RecordingStarted 是事件,UpdateList 是每当引发事件时应该执行的方法。之后,UpdateList 应该从 Recording 类中检索新数据,例如 GetNewData()。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-01
  • 1970-01-01
相关资源
最近更新 更多