2017-09-29 12 views
1

使用Angular4我已经为不同的数据库创建了服务。每个数据库的动作都是一样的(有点像CRUD),但有不同的API端点(但功能完全一样)。以编程方式将类型传递给服务的最佳方式是什么?

我正在为每个数据库创建一个服务,但我想一定有更好的方法来管理这个。

有没有办法在导入过程中或组件中传递“名称”给服务,以便服务知道应该点击哪个端点?

实施例:

import {ApiService} from '../_services/api.service.ts'; 

和在该服务:

let endpoint = enter code here defined from import of component 
private url = '/api/' + endpoint 
+0

当然,但这不是一个好主意。你让你的代码变得脆弱而难以阅读以节省几行 – bryan60

+0

你可以扩展它如何变得脆弱吗?有6 150个线路服务或1个服务延长6次更好吗? – kisonay

+0

6 150线服务。为了实现这一目标,你需要强制每个消费者遵守这种单一的服务风格,这将是一个固有的容易出错的过程,此外,潜在的单一服务的变化可能会破坏整个应用程序并促成重大重组,这就是它的意思变脆。角度风格指南建议干燥,但不要太干。这太干了。 Angular公开已经封装了主要CRUD操作的http客户端。没有理由让它变得更通用。 – bryan60

回答

1

喜欢的东西

@Injectable() 
abstract class ApiService { 
    protected endpoint; 

    protected get url() { 
    return '/api/' + this.endpoint; 
    } 

    constructor(protected http: Http) {} 

    getItems() { 
    return this.http(this.url); 
    } 
} 

class SomeService extends ApiService { 
    protected endpoint = 'some'; 
} 

注意endpoint被定义为一个场和url为只读存取,这允许在子类中保持适当的顺序。

较湿的版本(也可以让子类来注入额外的依赖)是:

@Injectable() 
abstract class ApiService { 
    constructor(protected http: Http) {} 
    ...  
} 

@Injectable() 
class SomeService extends ApiService { 
    constructor(http: Http /*, protected some: Some */) { 
    super(http); 
    } 
    ... 
} 

如果相同的依赖在父级和子类仍然存在,它应该有只在父类protected访问修饰符。

+0

接受这个答案,但在问题评论中@ bryan60指出,这可能会在将来的api修订中出现问题,在创建应用程序时应该考虑这些修订。 – kisonay

+1

如果它永远成为一个问题,那么使用OOP概念来生成DRYer代码并不是错误的使用它们。如果服务几乎完全相同,这是一回事。如果你想让弗兰肯斯坦的父母班级取悦所有可能的孩子,那是另一回事。我个人认为这种方法完全没有问题。这些类可以随时重构以适应案例。 – estus

+0

谢谢@estus,是的服务是相同的,只是不同的终点。我在注入后导出类,但Angular抛出“错误:无法解析所有参数为SomeService”任何想法为什么? – kisonay

相关问题