角度 - 模型和服务之间的差异

时间:2018-02-16 19:32:29

标签: angular typescript

我花时间学习新技术,而且技术是Angular(不是JS) 所以我有疑问。

模型和服务有什么区别? 当我们需要使用模型或服务时? 我知道我可以在提供商中使用DI进行服务和设置并获得单例模式。

之前,我只为业务逻辑编写模型。例如:对数据库的CURD操作,各种验证等。

但是当我需要使用服务和需要使用模型时,我会在服务和模型之间混淆。你能告诉我一些代码和解释吗?

非常感谢!

4 个答案:

答案 0 :(得分:2)

我通常会以下列方式对待它,但这一切都取决于您对应用程序的看法,我的答案可能不完全符合您的架构决策。

所以让我们从模型开始:

模型就像 DTO 。通常它只保存一些数据并提供一些处理该数据的方法。我的项目中的模型未标记为@Injectable(),因此我只是import将它们放在顶部并根据需要使用它们。

示例:

export class Car {
   name: string;
   speed: number;

   constructor(name: string) {
      this.name = name;
      this.speed = 0;
   }

   accelerate(delta: number): void {
      this.speed += delta;
   }
} 

<强>服务

服务就像您的架构中的 Layer 。我使用服务来操纵数据,例如执行GET / POST / PUT / DELETE请求,将响应映射到实际的模型等。所有这些请求都标记为@Injectable()并在应用程序中的众多模块之间共享。

示例:

@Injectable()
export class CarService {
    getAll(): Observable<Car[]> {
        // GET api/cars and map JSON response to the Car[] here
    }
}

总结一下:如果某些东西应该操纵属于它的数据,那么它更可能是模型,如果它应该操纵不同的数据集并在不同的模块之间共享它&#39 ;更可能是服务

然而,几年前,当使用MVC&#34; Active&#34;模型,它负责将自己的状态与后端同步,但无论如何它通常将服务注入其中,并将API调用逻辑封装到该服务中。

UPD:添加了一些代码示例。

答案 1 :(得分:0)

让我们以用户身份验证为例。 模型是您的数据的表示。在用户输入凭据后,您可以以UserCredentials模型的形式捆绑信息,如下所示:

export class UserCredentials {
    username: string;
    password: string;
}

您可以将服务用于业务逻辑。这可以是一个身份验证服务,它以UserCredentials模型作为参数并处理信息:

@Injectable()
export class AuthentificationService {
    authenticate(user: UserCredentials): boolean {
        // Your business logic here
    }
}

这种方法对于遵循SOLID原则非常有用。

答案 2 :(得分:0)

1。模型是对象的基本结构。 就像用户对象的不同属性一样。它可以有名字,姓氏,他拥有的汽车等。

  

在角度中,您可以将基本用户模型定义为:

export class User {
    firstName: string;
    lastName:string
    carsOwned: [Cars];
    constructor() {     
        this.Cars = [new Cars()];  //create array instance of a Car
    }
}

export class Cars {
    name: string;
    brand: string;
    constructor() { 

    }
}

2。服务就像您的应用程序的神经系统,可以从 Web服务,本地存储,模拟数据源或在不同类中共享数据添加和获取数据>(通过创建共享服务)。

  

以下是角度服务的示例

import { Injectable } from '@angular/core';
import { Http } from '@angular/http';
import { environment } from '../../../environments/environment';


@Injectable()
export class SchoolsService {
  options: any;
  constructor(private http: Http) {

  }

  addUser(userObj) {

    return this.http.post(environment.baseURL + '/addUser',userObj, this.options).map(
      (response) => response.json()
    )

  }
}

答案 3 :(得分:0)

我的答案是基于在MVC支架中使用Observable模式作为Controller以及如何在Angular 2+框架中解释该模式。

MVC脚手架中的Controller被切断为在视图和模型之间来回传递数据和事件的处理程序。在Angular中,可观察的RxJs库在相同的功能中运行,具有主题和侦听器。在这种情况下,如果您在服务中使用Observable,则它在与Controller相同的空间中运行,因此在这种情况下,我将使用Services。但是,如果您仅使用外部类进行数据操作,那么我给它指定模型的类类型。

严格来说,Angular不是MVC,但是随着您的应用程序变得越来越大,它是一种有用的组织工具,可以将您的代码分解为各自的职责。