【问题标题】:Business Rules Engine for angular ApplicationAngular 应用程序的业务规则引擎
【发布时间】:2018-05-12 16:01:00
【问题描述】:

我目前正在设计一个销售应用程序 (Angular 6 + Bootstrap) 来作为一个电信运营商的响应式应用程序,我的系统用户超过 10K,他们每天同时访问系统进行销售活动,并且我有很多业务规则需要运行,有时是顺序的,有时是并行的,有时是客户端业务规则,有时是基于 Web 服务调用 REST 运行的。

在另一个应用程序(HTML5 和 JQUERY)中,我们使用了手动设计的动作链概念,链中的每个动作都将 HTML 元素作为输入并开始应用逻辑,然后转发到下一个动作或失败并结束链。

我的问题是,考虑到整个后端是 RESTful Web 服务,如何在链概念中应用 Angular 应用程序中的业务规则。?

【问题讨论】:

  • Angular 使用支持链式可观察对象的 RxJS,这可能是您开始关注的地方。你可以从learn-rxjs 那里了解一些,认为它可能有一些过时的信息。
  • 让我们举一个例子,说明我需要在我的应用程序中做的事情更清楚:假设我有一个包含客户手机号码的文本字段,我需要申请以下业务这个手机号码的规则: 1-通过rest web服务检查后端系统(外部系统)中的手机号码状态,以确保其有效。 2-使用身份号码在另一个系统中检查所有者与当前客户相同的手机号码。 3- 检查客户是否在计费系统上的帐户中没有任何未结金额

标签: angular business-rules


【解决方案1】:

感谢您的支持..

我已经像 OOP 一样为我的操作/验证手动开发了它,并且 Angular 控制器将管理运行操作列表(如果存在)。

【讨论】:

    【解决方案2】:

    如您在示例场景中所说的实现检查的一种方法:

    首先,我们假设规则 1、2 和 3 是独立的,应该并行检查:

    请注意,在 Angular 中调用 API 的正确方法是通过 service

    let checkNumber1 = this.http.post('https://example.com/api/checkNumber', { mobileNo: '0123920802' });
    let checkNumber2 = this.http.post('https://example2.com/api/checkNumber', { mobileNo: '0123920802' });
    let checkOutstanding = this.http.post('https://example.com/api/checkOutstanding', { userId: 23910231 });
    
    forkJoin([checkNumber1, checkNumber2, checkOutstanding]).subscribe(results => {
        // results[0] is our result from checkNumber1
        // results[1] is our result from checkNumber2
        // results[2] is our result from checkOutstanding
        if (results[0] && results[1] && results[2]) {
            // if all checks return true 
            proceed();
        } else {
            error();
        }
    });
    

    如果您想按顺序进行检查,一种可能的方法是:

    checkNumber1.subscribe((result) => {
        if (result) {
            checkNumber2.subscribe((result) => {
                if (result) {
                    checkOutstanding.subscribe((result) => {
                        if (result) {
                            proceed();
                        }
                    });
                }
            });
        }
    });
    

    【讨论】:

    • 您的评论是有效的,但验证器将不可重复使用,如何在值更改时触发?以及如何将相同的验证(其中任何一个)与另一个 UI 组件一起使用??
    • 通常您希望将您的 API 封装在一个服务中,然后调用一个名为验证器this.validator.checkNumber(number) 的服务。使用诸如 onChanges 或 Angular 响应式表单的 valueChanges 之类的东西,您可以执行以下操作:this.form.valueChanges.pipe((x) => this.validator.checkNumber(x), (x) => this.validator.checkOutstanding(x))
    • 您不应该在“订阅”中包含“订阅”。使用 mergeMap 或其他运算符。
    • 从技术上讲,在处理 Http 调用时,多次订阅和使用 subscribe -> map -> subscribe -> map 之间没有任何区别。 mergeMap 和 concatMap 或任何其他运算符都会给出不同的行为,我绝不是说这是唯一的方法。
    猜你喜欢
    • 2010-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-26
    • 1970-01-01
    • 2014-10-23
    • 1970-01-01
    • 2011-03-17
    相关资源
    最近更新 更多