2017-09-29 16 views
1

Angular4を使用すると、私はさまざまなデータベース用のサービスを作成しました。プログラムに型をサービスに渡す最も良い方法は何ですか?

私はデータベースごとにサービスを作成していましたが、管理するためのより良い方法が必要であると考えています(これはCRUDと似ていますが)この。

インポート中またはコンポーネント内でサービスに「名前」を渡して、サービスがどのエンドポイントにヒットするのかを知る方法はありますか?

例:

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

とサービスで:endpointがフィールドとして定義され、urlが読み取り専用アクセサをすることを

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回線サービス。これを実現するには、すべての消費者が本質的にエラーが起こりやすい単一のサービススタイルに従うようにする必要があります。さらに、基礎となる単一サービスの変更により、アプリケーション全体が中断されて大規模なリストラが行われる可能性があります。脆くなる。角度のあるスタイルのガイドはDRYを推奨しますが、DRYは推奨しません。これはあまりにも乾燥しています。 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'; 
} 

ように注意してください、これにより、子クラスの適切な順序を維持することができます。

湿潤バージョン(また、子クラスは、追加の依存関係を注入することを可能にする)は、次のとおりです。

@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

これが問題になる場合は、OYAの概念を使用してDRYerコードを作成することは考えられませんが、DRYerコードを誤って使用することは考えられません。サービスがほぼ同一であれば、これは一つのことです。フランケンシュタインの親クラスをすべての子を喜ばせるためにしようとしているならば、それはもう一つのことです。私は個人的には、このアプローチが間違っているとは限りません。そして、クラスはケースに合わせていつでもリファクタリングすることができます。 – estus

+0

ありがとうございました@estus、はいサービスは同じ、ちょうど別のエンドポイントです。私は注射後にクラスをエクスポートしていますが、Angularは「エラー:SomeServiceのすべてのパラメータを解決できません」という理由を投げていますか? – kisonay

関連する問題