【问题标题】:How to inject custom service in SAPUI5如何在 SAPUI5 中注入自定义服务
【发布时间】:2018-04-28 05:03:36
【问题描述】:

SAPUI5 中是否有类似 Angular 服务的概念?我需要将一个自定义服务(基本上是一个带有一些方法的类)注入另一个自定义类,并且我期望框架会自动实例化我的自定义服务,但是当我尝试使用它时,它是一个构造函数而不是对象。 被不必要的细节删减的代码在这里:

定制服务:

    sap.ui.define([
    "sap/ui/base/Object",
    "ArA/model/productionOrdersDefinition/Order"
], function(Object, Order) {
    "use strict";
    return Object.extend("ArA.model.productionOrdersDefinition.InputProvider", {
        constructor: function() {

        },
        onInit: function(){
            this.order = new Order();
            this.order.id  = "0000133535";
            // ...
        },
        getOrder: function(){
            // ...
            return this.order;
        }
    });
});

使用自定义服务的对象:

    sap.ui.define([
    "ArA/model/productionOrdersDefinition/BaseObject",
    "ArA/model/productionOrdersDefinition/Order",
    "ArA/model/productionOrdersDefinition/InputProvider"
], function(BaseObject, Order, InputProvider) {
    "use strict";
    return BaseObject.extend("ArA.model.productionOrdersDefinition.ManagerProgrammazione", {
        constructor: function() {
            BaseObject.call(this);
            // this  InputProvider is a constructor (method) and getOrder is not a function
            var order = InputProvider.getOrder();
            // ...
        }
    });
});

【问题讨论】:

    标签: dependency-injection sapui5


    【解决方案1】:

    看起来你试图将你的经验和概念从 Angular 转移到 UI5。但最好以 UI5 世界中设计的方式来做 :)

    有一个模型的概念,主要是为了处理数据。您可以像以前一样创建自己的模型 - 基本 UI5 对象的扩展或JSONModel。很可能您不会使用 OData 协议进行网络通信,因此您会将数据存储在 JSONModel 中。

    在您的模型中声明特定于域的方法,并直接在您的控制器中或在应用程序的组件中实例化它们(如果您希望有一种可用于所有控制器的全局模型)。您可以通过getOwnerComponent 方法从任意控制器获取组件实例。

    另一种组织数据模型的方法 - 是创建一种称为“BO”的特殊对象 - 业务对象,此 BO 将处理所有特定领域的事务(实例化所需的模型、进行网络、数据操作等)。因此,您需要在控制器中创建此 BO,并在触发用户操作后从控制器调用所需的高级方法。

    此外,您还必须注意在控制器或组件生命周期方法中销毁模型/BO。

    【讨论】:

      【解决方案2】:

      只需在代码中添加实例化,它就应该开始工作了:

      var this._oInputProvider = new InputProvider();
      var order = this._oInputProvider.getOrder();
      

      【讨论】:

      • 是的,我这样做了,它有效。我来自 C#,通常我避免在使用它的类中实例化依赖项以使其“可单元测试”,但在 js 中我可以有效地注入不同的构造函数
      猜你喜欢
      • 2016-09-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多