日期:2014-05-20  浏览次数:20783 次

[内详]B中有A的实例,A,B定义了相同的一个event,A抛消息给B,再由B往外抛,是否合理?
分层是一种比较好的模块化方法, 实际使用中也确实如此
但是这样会出现很多代码的重复, 比如标题中情况, 关于消息处理, 就有重复, 感觉与 DRY(Don't Repeat Yourself) 又抵触了
大家怎么认为? 又或者是如何处理这种问题的? 欢迎讨论
C# code

class A {
    public event EventHandler TheEvent;
    protected void RaiseTheEvent()
    { 
        if (TheEvent != null) {
            TheEvent(this, EventArgs.Empty);
        }
    }
}

class B {
    public event EventHandler TheEvent;
    protected void RaiseTheEvent()
    { 
        if (TheEvent != null) {
            TheEvent(this, EventArgs.Empty);
        }
    }

    A _a = new A();

    B()
    {
        _a.TheEvent += delegate
        {
            RaiseTheEvent();
        };
    }
}



------解决方案--------------------
A中的消息给A的调用者使用
B中的消息给B的调用者使用

没有冲突

如果C是B的调用者,则C只关心B的事件
例子中B是A的调用者,B只关心A的事件
C此时可以关心A的事件,也可以不关心
------解决方案--------------------
LZ的意思是代码冗余了?

有时为了便于改动维护而分层确实会造成部分代码冗余
------解决方案--------------------
这种设计很合理,不同事件有不同用途,还可继承接口实现操作
------解决方案--------------------
我并没看出哪里有代码冗余,只是你在A和B里的事件名称相同而已。
这种做法是合理的。A可以有自己的事件,至于谁订阅了这个事件,A并不理会;代码中B订阅了A的事件,那么当B对A做了某种操作时,立刻会触发A中的这个事件,而这个事件又会由B转发给B的调用者(假设为C)。从C的角度看,是B发生了某件事情,但具体是谁使B发生了这件事?是A引起的,还是B本身自发的?就可以通过sender来判断。

------解决方案--------------------
楼上的分析到位,把对象之间的依赖性进行分拆。
------解决方案--------------------
我不喜欢,但我也在用.....
------解决方案--------------------
我就这种类似的办法!


为了后期,就这样!