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