《我自己的课堂》中包装存在事件的设计模式

本文关键字:存在 包装 事件 设计模式 我自己的课堂 我自己 自己的 课堂 | 更新日期: 2023-09-27 18:11:59

all:

这个问题来自我目前正在进行的C#项目。在解决方案中,它包括三个项目,一个是UI项目,另一个是接口项目,第三个是组件项目。我的解决方案的基本思想是UI项目可以动态加载继承接口项目中定义的接口的组件DLL。在接口项目中,我定义了两个类,一个是UI项目用来动态加载DLL的接口,这个接口定义了组件对象中的所有暴露实体。除了这个接口之外,还有一个抽象的组件核心类继承了公共接口,它包含了实际组件对象中的所有公共操作。我在下面画了一个情节来描述我之前的解释。

"UI类--->接口<---抽象组件核心<----实际组件">

在我的设计中,我在抽象组件核心对象中使用了C#BackgroundWorker。BackgroundWorker包含两个事件ProgressChanged和RunWorkerCompleted。在我的设计思想中,这两个事件应该由UI类注册。例如,UI类可以在组件的BackgroundWorker进度更改或操作完成时注册其操作。另一件事是,我不想将组件核心中的BackgroundWorker对象公开给UI类,所以BackgroundWorkers对象是在抽象组件核心中定义的,而不是在接口中。所以在我的原始设计中,我在接口中创建了两个事件,它接受和BackgroundWorker的两个事件相同的事件处理程序。如下:

event EventHandler<ProgressChangedEventArgs> ProcessChanged;
event EventHandler<RunWorkerCompletedEventArgs> RunWorkerCompleted;

在稍后的一些地方,我将把这两个事件处理程序分配给BackgroundWorker的实际事件。代码如下:

mBackgroundWorker.ProgressChanged += new ProgressChangedEventHandler ( this.ProcessChanged );
mBackgroundWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler ( this.RunWorkerCompleted );

但我不喜欢这种设计。因为componet的用户(这里是UI类(将其事件处理程序分配给组件的事件,并且它是实际操作,所以组件会将(+=(此事件处理程序添加到BackgroundWorker的事件处理程序中。因此,如果UI一次又一次地运行,BackgroundWorker将有几个相同的事件处理程序。我的想法是:1-BackgroundWorker的事件只能包含一个事件处理程序;2-当用户将事件处理程序分配给组件核心自己的事件时,可以将该事件处理程序同时转移到BackgroundWorker的事件;

有人能给我一些可行的设计想法吗?谢谢

《我自己的课堂》中包装存在事件的设计模式

我找到了一个解决方案来解决我的问题。我可以使用add和remove关键字来客户定义我的组件核心类中的事件访问器。代码如下:


        public virtual event ProgressChangedEventHandler ProcessChanged
        {
            add
            {
                lock ( mEventLock ) { mBackgroundWorker.ProgressChanged += value; }
            }
            remove
            {
                lock ( mEventLock ) { mBackgroundWorker.ProgressChanged -= value;}
            }
        }

所以这可以解决我的问题。分配给组件核心事件的用户可以立即将事件分配给BackgroundWorker的相关事件。这就是我想要的。所以在我上面的问题中,两部分代码可以集成到一部分代码中。