两个服务如何以双向方式相互通信?

2024-05-12

一种是通过事件,另一种是通过调用方法。我试图在我的应用程序中实现聚合模式。

我有 AuthService,在这里我处理身份验证结果并发出事件。

if (auth) { this.eAuth.emit(true) } else { this.eAuth.emit(false) }

我可以在 AuthComponent 中订阅

_authService.eAuth.subscribe( (isAuth) => this.handleAuthResult(isAuth) )

而且效果很完美。但AggregateService也需要知道这一点,并将此信息广播给UserService、LoadDataService等。

怎么做?

upd:我的 AggregateService 没有组件,我已经将 AuthService 注入其中。


如果Service被注入到Service中,Service可以调用ServiceA上的方法(因此ServiceB→ServiceA通信)并且它可以subscribe()到 ServiceA 可能公开的任何 Observable(因此 Service → 到 Service 通信)。

缺少的是 ServiceA 直接调用 ServiceB 上的方法的能力。通常不建议这样做,因为它会在服务之间产生耦合。 ServiceA 应该使用以下方式发出事件next()ServiceB 可以在 Observable 上subscribe()至此,服务可以调用自身适当的方法。

但是,如果您确实需要此功能,可以使用以下一种方法:让 ServiceB 调用某种registerService(this)ServiceA 上的方法。参数的类型应该是接口而不是具体类型,以限制耦合。然后ServiceA将拥有对ServiceB的引用,并且可以调用其上的方法。

interface SomeInterface {
  public methodOne();
  public methodTwo();
}
import {SomeInterface} from './some-interface';
export class ServiceA {
    registerService(someService:SomeInterface) {
       someService.methodOne(this);
       // you'll probably want to store someService in this object
    }
}

服务B应该implement该接口——即实现 ServiceA 可以调用的一组方法。

import {SomeInterface} from './some-interface';
export class ServiceB implements SomeInterface {
    constructor(private _serviceA: ServiceA) {
       _serviceA.registerService(this);
    }
    methodOne(who) {
       console.log('hello from ServiceB.methodOne(), called by', who);
    }        
    methodTwo() { ... }
}

Plunker http://plnkr.co/edit/YLiEg1GHUoo4CSz2A8WX?p=preview

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

两个服务如何以双向方式相互通信? 的相关文章

随机推荐

  • 如何使用 pandas 对一系列值进行编码

    我有一个 pandas 数据框并且有一列age 我想将其编码为按特定范围分隔的分类值 例如 15岁以下的年龄应为0 15到30之间的年龄应更改为1等等 我找到了这种方法来做到这一点 在经历了关于使用的巨大困惑之后 and and age X
  • 未调用派生类的 C++/cli 静态构造函数

    如上所述在我的另一篇帖子中 https stackoverflow com q 29410579 2505186从 VS 2008 net 3 5 迁移到 VS 2013 并使用 net 4 0 而不是 4 5 后 我发现我的应用程序出现了
  • 为什么 EF DataBase First 不使用 getdate()?

    我首先使用 EF 4 1 和数据库 示例表 CREATE TABLE dbo Product ID int IDENTITY 1 1 not null Title nvarchar 200 not null CreateDate datet
  • 某些表格后的分页符

    我的问题是 我有一个页面 其中包含几个要打印的 html 表格 有些表有很多行 有些则没有 我想要做的是将第一个和第二个表 大表 打印在单独的页面中 其余表 小表 每页打印两个 如何在我想要的位置放置分页符 我试过 但这会在每个表格后面添加
  • 单个语句中的多个复合赋值:是否是未定义行为?

    我找不到明确的答案 以下代码是否有未定义的行为 int x 2 x x x 2 5 该行为是未定义的 让我们看一下稍微简单的表达式 x x 1 在C 11中 左边的值计算x相对于表达式的值计算是无序的 x 1 这意味着值计算x相对于分配而言
  • 如何在Mac上使用eclipse安装jetty

    我是一个新手 jetty 和 RESTful API 我想使用 Jetty 创建 REST 服务 并希望将嵌入式 jetty 与 eclipse 一起使用 任何人都可以建议我在 Mac OS 中使用 Eclipse 安装 Jetty Jet
  • RecyclerView.OnScrollListener:一次滚动实例被多次调用

    我有一个水平布局的回收视图 一次只有一个视图可见 mRecyclerView findViewById R id rvmain mRecyclerView setOnFlingListener null final SnapHelper s
  • 数组和关联数组合并

    如何实现第三个数组 合并Array1和Array2 在 PHP 中做到这一点的最佳方法是什么 非常感谢 Array2 具有类似索引 键 即 Array1 中 id 的关联值 Array1 Array 0 gt Array id gt 56
  • 使用 Pyqt4 从 URL 下载数千个 PDF

    理想情况下 我试图从给定网站下载数千个 PDF 然而 由于某种原因 它甚至无法下载 100 个 PDF 我不知道为什么 这是代码 usr bin env python import time from pyPdf import PdfFil
  • IBDesignable 和 UITableViewCell

    我正在尝试利用 XCode 6 中 Swift 的 IBDesignable 功能来创建 UITableViewCell 的子类 我在 WWDC 演示和网络上看到 您可以使用框架来创建视图 UIView 的子类 然后可以将其用于自定义 UI
  • 没有名为“picamera”的模块

    我关注了这个网站 https www pyimagesearch com 2015 03 30 accessing the raspberry pi camera with opencv and python https www pyima
  • 如何制作任意级别的嵌套for循环

    我可以像这样做一个两级嵌套循环 for i1 in 1 n for i2 in 1 n do something with i1 i2 如何将其扩展到任意级别的嵌套循环 例如 我可以在 Python 中执行此操作以循环 n m 的笛卡尔积
  • 如何在environment.yml中安装CRAN包

    我正在使用 miniconda 来管理数据科学包的安装 这是我现在已经建立的工作流程 所以我希望它也能在这种情况下工作 我也认为它可以工作 因为它应该在这样的情况下有所帮助 比纯 python 需要更多的依赖项 我想安装pythonCDT工
  • NSMenuItem with attributeTitle 包含 NSFont 对象,绘制带有基线偏移的标题

    我正在尝试使用系统中可用的字体列表创建一个 NSPopUpButton 看起来很明显的任务 但我失败了 我想 我错过了一些如此明显的事情 以至于我完全忘记了它 代码非常简单 let button NSPopUpButton button m
  • 用于不规则时间序列的滚动窗口函数,可以处理重复项

    我有以下数据框 grp nr yr 1 A 1 0 2009 2 A 2 0 2009 3 A 1 5 2009 4 A 1 0 2010 5 B 3 0 2009 6 B 2 0 2010 7 B NA 2011 8 C 3 0 2014
  • 如何使用 http 将 Android 中的文件从移动设备发送到服务器?

    在android中 如何使用http将文件 数据 从移动设备发送到服务器 很简单 您可以使用 Post 请求并将文件作为二进制 字节数组 提交 String url http yourserver File file new File En
  • 如何使用 srlua 制作可执行的 Lua 脚本?

    我的主要目标是使我的 lua 文件成为可执行文件或使其成为咬代码 最好是两者皆有 我正在尝试 srlua 但在自述文件中它告诉我要做的事情 对于Windows 您需要首先创建srlua exe和glue exe 然后为每个 你想把Lua程序
  • 如何在datepickerdialog android中选择年份?

    我是 Android 编程新手 请帮忙 我正在使用创建材料设计的片段DatePickerDialog点击EditText 问题是它设置为当前日期 由我设置 但是 如果用户必须选择过去的日期 比如说 10 年前 用户必须每月滚动 这是痛苦的
  • 在 Android 中绘制一条带有弯曲边缘的线

    I am using canvas drawLine to draw some line in android but the lines are too sharp but i need a curved edges 这里的 1 是我所拥
  • 两个服务如何以双向方式相互通信?

    一种是通过事件 另一种是通过调用方法 我试图在我的应用程序中实现聚合模式 我有 AuthService 在这里我处理身份验证结果并发出事件 if auth this eAuth emit true else this eAuth emit