C# 在多项目中引发自定义事件

C# 在多项目中引发自定义事件,c#,.net,events,circular-dependency,multi-project,C#,.net,Events,Circular Dependency,Multi Project,它涉及以下内容:我有两个项目,它们应该或多或少独立存在。Project one是一种文件系统监视程序。另一个是我的用户界面。如果有新文件,文件监视程序将引发事件。之后,文件中的数据应添加到数据库中。这大概就是背景故事。实际问题是,在文件观察程序引发事件后,我想通知UI更新数据视图。这意味着,事件应该由文件观察者引发,并且应该在UI的实现中注册事件。现在主要的问题是,我需要两个项目中的类实例。很明显,这导致了循环依赖问题。当然有解决CP问题的接口解决方案,但这并不能解决问题,我需要相同的对象来创建

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

我不知道为什么FileWatcher会依赖于您的UI,但既然您这么说,您可以添加第三个项目作为两者之间的一个项目。这将使两个项目都依赖于聚合器,但会删除彼此之间的依赖关系。

为什么您认为业务逻辑程序集中需要一个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的程序集引用具有逻辑的程序集。这里没有循环依赖关系。

为什么您的文件查看器需要来自UI的类?对不起,我没有解释清楚。UI不需要任何依赖关系:也许我可以用几行代码来澄清我的问题:FileWatcher:Recording rec=new Recording();rec.NotifyUI();UI:录制pat=新录制;pat.RecordingStarted+=listview.UpdateList;Recording是FW项目中的一个类,RecordingStarted是事件,UpdateList是在引发事件时应执行的方法。之后,UpdateList应该从Recording类中检索新数据,如GetNewData()。谢谢您的示例。我已经意识到了您的解决方案,但问题像以前一样在于这一行:this.watcher=CreateWatcher();如何创建watcher的实例,这与我在RegisterEvents()中注册evnet后以及调用watcher.RaiseEventForWhateverReason()时的情况相同。这是我的主要问题。此外,应以任何方式区分实例,因为观察者可以在短时间内收到许多事件。观察者是一个字段。您分配它,它将保持指向同一实例。正如我在示例中所指出的,sender参数将是引发事件的实例-您只需要强制转换它并将其分配给一个局部变量:Watcher theSender=(Watcher)sender。如果您有多个实例,这将有助于您实现。