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