NativeScript:class 和服务之间的区别?

NativeScript: Difference between a class and a service?

我正在尝试进入 Nativescript + Angular2,我在 tutorial 中阅读了以下内容:

We’ll build this functionality as an Angular service, which is Angular’s mechanism for reusable classes that operate on data.

然后他们做的是创建一个简单的 class,像这样:

import { Injectable } from "@angular/core";

import { User } from "./user";

@Injectable()
export class UserService {
  register(user: User) {
    alert("About to register: " + user.email);
  }
}

现在,我真的看不出普通 class 和服务之间的区别 - 这是一个非常普通的 class 定义。

那么,为什么它被称为“Angular 服务”?

This creates a basic Angular service with a single method that takes an instance of the User object you created in the previous section.

此外,在教程中使用此“服务”时,我不清楚此 class 何时实例化 - 何时执行构造?对象是否保存在内存中供以后使用?教程中唯一对“userservice”的调用是这样的:

import { Page } from "ui/page";
import { Component, ElementRef, OnInit, ViewChild } from "@angular/core";
import { User } from "../../shared/user/user";
import { UserService } from "../../shared/user/user.service";
import { Router } from "@angular/router";
import { Color } from "color";
import { View } from "ui/core/view";


@Component({
  selector: "my-app",
  providers: [UserService],
  templateUrl: "./pages/login/login.html",
  styleUrls: ["./pages/login/login-common.css", "./pages/login/login.css"]
})
export class LoginComponent implements OnInit {
  user: User;
  isLoggingIn = true;
  @ViewChild("container") container: ElementRef;

  constructor(private router: Router, private userService: UserService, private page: Page) {
    this.user = new User();
    this.user.email = "bla@bla.com";
    this.user.password = "1234";
  }
  //.... methods and stuff...
}

在这种情况下,

A class 是一个常规的 class,就像在任何其他 OO 语言中一样:"prototype" of object,您可以简单地创建实例使用:

let myInstance = new MyClass(<arguments...>);

所以,实际上,一个 Angular 服务 也是一个 class。

但将服务视为 特殊 的一种 class。常规 classes 和服务 classes 之间的主要区别在于 它们的生命周期 ,特别是谁创建了它们的实例(谁调用了 new)。

服务实例由 Angular "container"(实际上是 angular injector)创建和管理(处置)。

您还可以在其他服务 classes(或其他托管组件)的构造函数中 "inject" 服务实例 classes。

服务功能中的一个很好的资源是Angular's Dependency Injection Guide

When is the construction executed?

注入器执行构造。什么时候?见下文。

Is the object saved in memory for later use?

有可能。取决于您在哪里注册服务。

首先要知道 Angular DI 是 hierarchical injection system.

如果您使用 Angular 模块注册服务,该服务将由应用程序的根注入器创建。所以它下面的每个人(也就是那个模块中的每个人)都将收到相同的服务实例。换句话说,Angular(将只调用注入器一次)将只创建服务的一个实例 class 并将同一实例传递给请求该服务的任何人。只要该模块存在,该实例就会存在。

现在,如果您向组件注册服务,则该服务将向该组件的注入器注册。因此,当此类组件请求服务实例时,angular 将调用注入器并创建一个实例。如果该组件的任何 child 请求此类服务的实例,angular 将提供相同的实例。没有其他人,只有 children 的组件,会收到相同的实例。当该组件死亡时,服务实例也会死亡。

How does a "regular class" differ? It lacks the Injector?

不同的不仅仅是没有注射器。

Angular 除了 JavaScript:您通过在代码中某处调用 let instance = new MyRegularClass() 来创建 "regular class" 的实例,对吗?

instance 没有 "magical effects",它的功能与任何 class 一样(只是常规的 JavaScript 方法和属性)。示例:如果您需要其他 classes 的实例作为构造函数中的参数,没有人会 "magically" 为您创建这些实例并传递它们。在调用 new(例如 new MyClass(new SomeOtherClassIDependOn(), ...))时,您必须手动创建它们。如果您只想实例化 SomeOtherClassIDependOn 一次并在需要的地方重复使用同一个实例,您将必须保存该实例并将其传递到任何需要的地方。

不过,作为服务,angular 可以减轻您的一些负担。

现在,在任何事情之前:因为每项服务,在深处,一个class,必须有人打电话给new MyServiceClass()。不同之处在于某人不再是你。您的代码中没有 new UserService() 。那么,它是谁?这个人就是Injector.

当Angular 注意到有人请求服务时,它会要求注入器实例化该服务。注入器然后调用 let serviceInstance = new MyServiceClass(<dependencies>) 并向其添加一些 "magic" (例如,它可以将 - inject - 其他服务的实例传递给服务的构造函数),并且使其对在您注册范围内请求该服务的任何人可用(保存)。

注意:您 可以 自己调用 new UserService(...),因为它 UserService 是 class。但是这个实例是一个常规的object,不受angular管理,没有魔法(不会注入构造函数参数,没有实例被保存和重用)。