我花时间学习新技术,而且技术是Angular(不是JS) 所以我有疑问。
模型和服务有什么区别? 当我们需要使用模型或服务时? 我知道我可以在提供商中使用DI进行服务和设置并获得单例模式。
之前,我只为业务逻辑编写模型。例如:对数据库的CURD操作,各种验证等。
但是当我需要使用服务和需要使用模型时,我会在服务和模型之间混淆。你能告诉我一些代码和解释吗?
非常感谢!
答案 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,但是随着您的应用程序变得越来越大,它是一种有用的组织工具,可以将您的代码分解为各自的职责。