在多项目中提升自定义事件

时间:2010-07-29 08:58:07

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

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

2 个答案:

答案 0 :(得分: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
   }
}

使用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进行装配使用逻辑引用装配。这里没有循环依赖。

答案 1 :(得分:0)

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