在依赖注入系统事件往哪个方向走?(Events in a Dependency Injection

2019-08-17 14:55发布

上或下?

我是一个非常视觉化的人。 我想我的应用程序的一个层次结构,其中最上层是根,底部是叶。

我也是理解的是,在DI系统,容器是不知道自己包含的对象的责任/功能下。 相反,所包含的对象了解他们的背景,因为上下文(依赖)中被注入。

UP:(非DI呢?)
如果我的事件从我的层次和气泡向上父母的底部出动? 例如,在我的GUI按钮调度CLICKED事件,该事件是由通过进行适当的行动来响应监听容器抓获。

DOWN:(DI的方式?)
如果我的事件从我的层次结构的顶部由家长其孩子听出动? 例如--...好吧,我有想出这个麻烦。 我沿着调度为包含的对象事件调解的思路思考。

“上”很自然地我,但由于DI具有容器是不知道它包含的对象的行为,我不希望自己的事件作出响应。

编辑(澄清):

我意识到这可能有几乎任何部分的系统的监听事件,但我想了解DI参与者之间的基本关系,这样我就可以适当地构造它们。 我假设的人通常不只是分散他们的程序事件,不考虑结构关系,相关性等

我的问题是从一个DI系统的责任布局 - 这是被注入的对象的责任,使进样器调用和喷油器的reponsibility向依赖于它的对象提供服务(用于反转非DI范式 - 因此同义词,如“反转的控制”和‘依赖倒置’)。 这似乎是DI的一个非常重要的,基本的组成部分 - 责任的转移。 我考虑调用对象的功能,或听其事件取决于其他对象的同时为例子。 当一个对象的基础上定义另一个对象自身的行为,我称之为的依赖,因为一个物体其他都知道,也知道对方做什么。 它的其他对象的上下文中定义本身。 据我所知,DI设置,使被注入的对象取决于喷油器,所以它应该是被注入的对象的责任心知道所有关于注射器。 而且它不应该被注射器的责任心了解注入的对象。 因此,对于喷油器是听所包含的注入对象上的事件我看来,像类似职责的错位,因为这意味着它知道一些关于它的内容。

请告诉我,是否以及如何这是错误的。

Answer 1:

依赖注入和Observer模式中的角色分配是正交关注。 对象可起到观察者的角色或观察到的,并且同时是任一构成对象,该对象组成,二者,或两者都不是。

考虑其中一个按钮,通过控制构成的典型的例子。 当点击该按钮时,它会引发其由含有控制响应了Clicked事件。 在这种情况下观察物体构成观察对象。

现在考虑组成一个数量的控制画面。 屏幕可能会提出一个Closing事件,让整个屏幕关闭之前所编写的控制来执行自己的清理工作。 在这种情况下,所观察到的对象构成的观察员。

现在考虑组成一个按钮和一个标签的屏幕。 当点击该按钮,标签的清除()方法被调用。 在这种情况下,既不观察者观察也不构成其他,但两者都是由画面对象组成。

现在考虑这引起了其自身订阅(也许是确保自己是被注册的最终事件处理程序)closing事件的屏幕。 当它提出了一个Closing事件,允许任何观察员首先执行他们可能需要的任何行动,这再处理它自己的事件。 在这种情况下,观察者所观察到的。

依赖注入的关注对象如何获取它的依赖。 注入到一个给定的对象的依赖性可以包含对象要订阅事件,或依赖可以订阅它被注入到该对象。 如何两个对象一个被注入到另一个后,不会真的有什么关系依赖注入互动。

编辑

关于你的澄清部分,我相信我理解你的问题的根源。 传统上,对象创建自己的依赖。 依赖注入反转由移动的依赖关系是如何在对象的外部获得的知识,获得这些相关的责任。 依赖注入不反转的依赖关系。然而。 您可能会产生混淆依赖注入与依赖倒置原则 。 的依赖倒置原则做反向“高电平”和“低电平”对象之间的依赖关系,但依赖注入仅涉及依赖关系是如何提供给一个给定的对象。 因此,依赖注入的使用并不会改变物体正常与人交往。 如果之前,使用订阅由对象A(或反之亦然)引发的事件依赖注入对象B,引入依赖注入不会改变这一点。



Answer 2:

根据我的经验活动将开始在较低水平上,那么,你的轮胎撞击坑洞,这将振动的车,当轮胎被注入汽车类。

但是,你需要做出一定的每一个部分能够处理的事件。

如果车行至快,轮胎转速加快,但这并不是因为一个事件,但由于呼吁轮胎的功能将它达到一定的速度。

我看到它往上走,但是你没有指定你是如何确定的方向。



Answer 3:

我说下向上是要走的路。 什么,你可能是后一个责任链排序模式。 活动开始举行的“叶子”。 叶任一处理它,或者将其传递了层次结构的父对象。 叶的父对象或者处理它或进一步通过它的层次结构等

我不认为它违反了任何DI原则。 层次结构中的所有对象必须实现与此类似,接口虽:

interface IEventHandler {
    void setNextHandler(IEventHandler nextHandler);
    void handleEvent(Event e);
}


Answer 4:

使用Observer模式为模板,这里的“父”是调度事件和“孩子”的对象是注册的侦听器等待/观察事件,然后作用于事件。 因此,无论从上到下,从左到右,但是你概念化的原理是相同的。

编辑:看看这个可视化描述观察员



Answer 5:

你知道一些有关消息总线架构,如事件和请求?

在高并发系统,低层处理的东西,如I / O或鼠标点击等,这是时间comsumable或操作可能被阻塞,例如磁盘I / O或网络消息的Tx / Rx; 而高层总是更快地处理业务,又名,逻辑计算,因为高层不会涉及到任何的I / O等。在这样的系统中,一个事件是,它通知你出事了高层的通知。 例如,一包已经到达,或者一个字符串已写入磁盘。 一旦高层得到通知,他们将继续前进来从事件的缓冲区中的数据,并分析这是由事件发送的数据包。 如所提到的提取和解析是纯逻辑运算和速度非常快。 完成之后,它们可以发送请求(例如发送一个ACK数据包),以低的层。 从上往下的要求是无块,非常快。 低层将处理请求,做“实发”,又名,I / O操作。 高层和低层使用队列设施等进行沟通。

因此,在这样的系统中,你会同意的事件应该从底部向上走。

向上或向下,这取决于你选择了模型。

也看到了在ducoment“EffoNetMsg.pdf”在描述高度并行模式http://code.google.com/p/effonetmsg/downloads/list 。



Answer 6:

如何以类似的方式来绑定WPF通过事件?



文章来源: Events in a Dependency Injection system go which way?