【问题标题】:Routing events by the event object type按事件对象类型路由事件
【发布时间】:2014-07-16 20:44:51
【问题描述】:

将事件路由到类中的事件处理程序的最佳方式是什么,希望不需要手动连接它们。

在下面的代码示例中,只需将事件转换为 dynamic,即可将事件路由到正确的处理程序。

class Program {        
    static void Main(string[] args) {
        var myEvent1 = new MyEvent1() as object;
        var myEvent2 = new MyEvent2() as object;
        var myObject = new Inherited() as Base;
        myObject.On(myEvent1);
        myObject.On(myEvent2);
    }
}

public class MyEvent1 {
}
public class MyEvent2 {
}

public class Base {
    public void On(object @event) {
        On((dynamic)@event);
    }
    public void On(MyEvent1 @event) {
        // it works!
    }
    public void On(MyEvent2 @event) {
        // it works!
    }
}

public class Inherited : Base {
}

但是,当我将类型化事件处理程序移动到继承的类时,处理程序不再工作:

class Program {        
    static void Main(string[] args) {
        var myEvent1 = new MyEvent1() as object;
        var myEvent2 = new MyEvent2() as object;
        var myObject = new Inherited() as Base;
        myObject.On(myEvent1);
        myObject.On(myEvent2);
    }
}

public class MyEvent1 {
}
public class MyEvent2 {
}

public class Base {
    public void On(object @event) {
        On((dynamic)@event);
        // stack overflow happens here :(
    }
}

public class Inherited : Base {
    public void On(MyEvent1 @event) {
        // nothing happens :(
    }
    public void On(MyEvent2 @event) {
        // nothing happens :(
    }
}

显然,它需要使用继承类中的处理程序(我必须使用myObject 作为基类的实例),因此我找到了一种更好的方法来路由事件。

【问题讨论】:

    标签: c# cqrs


    【解决方案1】:

    试试这个:

    ((dynamic)this).On((dynamic)e);
    

    【讨论】:

    • 疯狂的天才!非常感谢
    • 我一直在查看使用 ILSpy 生成的代码,似乎有相当多的编译器生成的代码替换了 dynamic 演员表。基本问题是编译器生成的代码直接引用类,忽略继承:(生成代码的伪示例)Binder.InvokeMember("On", typeof(Base), new [] {...}); ..so 首先转换为实例类型this 解决该问题
    • 感谢 Maxwell 对 ILSpy 的深入研究……因此对每个事件都进行了反思,用 cpu 周期代替了开发人员的时间。该系统将在 Orleans 上运行在具有 CQRS 设计原则的自动扩展云集群中 - 我很高兴了解它的工作原理。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-06
    相关资源
    最近更新 更多