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

时间:2014-07-09 02:12:52

标签: c# .net

所有

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

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

在我的设计中,我在抽象组件核心对象中使用C#BackgroundWorker。 BackgroundWorker包含两个事件ProgressChanged和RunWorkerCompleted。在我的设计理念中,这两个事件应该由UI Class注册。例如,UI类可以在组件的后台工作进程改变或操作完成时注册其操作。另一件事是我不想将Component Core中的BackgroundWorker对象暴露给UI类,因此BackgroundWorker对象在抽象组件核心中定义,而不是在接口中定义。所以在我的原始设计中,我在接口中创建了两个事件,它接受与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的事件;

任何人都可以给我一些可行的设计理念吗?谢谢!

1 个答案:

答案 0 :(得分:0)

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


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

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