gpt4 book ai didi

c# - 在哪里订阅内部对象的事件?

转载 作者:行者123 更新时间:2023-11-30 17:07:32 25 4
gpt4 key购买 nike

我经常遇到这样一种情况,我必须决定在哪里订阅内部对象的事件?

例如,我有一个如下所示的对象模型:

class ClassA
{
public event EventHandler SomeEvent1;
public event EventHandler SomeEvent2;
public event EventHandler SomeEvent3;
public event EventHandler SomeEvent4;
}

class ClassB
{
private ClassA a;
public ClassA A
{
get
{
return this.a;
}
}

public ClassB()
{
this.a = new ClassA();
// here subscribe to some events (for example, SomeEvent1 and SomeEvent2)
// this.a.SomeEvent1 += OnSomeEvent1Raised;
// this.a.SomeEvent2 += OnSomeEvent2Raised;
}
}

class ClassC
{
public ClassB B { get; }
}

class ClassD
{
public ClassC C { get; }

public void SomeMethod()
{
// Here subscribe to another ones events of object C.B.A. For example:
C.B.A.SomeEvent3 += OnSomeEvent3Raised;
C.B.A.SomeEvent4 += OnSomeEvent4Raised;
}

private void OnSomeEvent4Raised(object sender, EventArgs e)
{
throw new NotImplementedException();
}

private void OnSomeEvent3Raised(object sender, EventArgs e)
{
throw new NotImplementedException();
}
}

我尝试创建类似 UML 图的东西: enter image description here

我的项目的现有代码结构中有这样的对象模型存在的地方(它有一个地方可以订阅如上例中实现的事件 - C.B.A.SomeEvent+=)。我不喜欢它,想改变它。我想向您介绍有关这种情况的最佳做法。

另一种方法是在 classB、classC、classD 中复制 classA 的所有事件。然后将所有事件订阅替换为ONE PLACE(我的意思是在classB中我们将订阅/取消订阅ClassA对象的所有事件。在classC中我们将订阅/取消订阅所有事件classB 的对象。等等...)在这种情况下,所有订阅和取消订阅都将在一个地方。希望您明白我的意思。

再次,请根据您的知识和经验告诉我们如何解决这种情况。

更新

您是否同意我对事件的订阅和取消订阅必须放在一个地方?请也回答这个附加问题。

提前致谢。

最佳答案

您可能对 event aggregator 感兴趣.

它基本上所做的是将发布者与订阅者分离 - 它是一种事件容器。您可以通过依赖注入(inject)(例如 MEF)为您想要订阅或发布的每个类获取事件聚合器。

我个人最喜欢使用的方式是 Rob Eisenberg 在 Caliburn Micro 中实现事件聚合器的方式:

在您的情况下,对象 A、B 和 C 将共享事件聚合器的同一实例,这意味着一旦事件发布到该事件聚合器上,所有这些对象都会识别它。由于对某些事件的不同处理,A、B 和 C 类能够表现不同。

编辑

事件聚合器的使用是,您使用类的实例订阅聚合器本身。发布者和订阅者类之间的连接依赖于事件聚合器的同一个实例。在 Caliburn.Micro 的情况下,对某些事件的订阅是通过实现通用接口(interface) ( IHandle<> ) 发生的。例如:如果您想订阅 MyCustomEvent你实现 IHandle<MyCustomEvent>要订阅的类中的接口(interface)。这需要执行 void Handle(MyCustomEvent e)来自 IHandle<MyCustomEvent> 的方法此类事件的接口(interface)。每次(新)MyCustomEvent 时都会调用此方法发布在共享事件聚合器上。

关于c# - 在哪里订阅内部对象的事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14479471/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com