実現したいこと
Angularのとあるクラスにて、同一インターフェースを実装した複数の実装クラスを引数として受け取れるようにしたいと思っています。もう少し具体的な所で言うとDAOが使うデータアクセスサービスを、HTTP経由のAPI形式やデータベースへの直接接続など、提供される形式に応じて入れ替えられるドライバークラスを実装しようとしています。
発生している問題
Chromeのデベロッパー ツール上のコンソールで以下のエラーが出てます。
compiler.js:485 Uncaught Error: Can't resolve all parameters for dao: (?). at syntaxError (compiler.js:485) at CompileMetadataResolver._getDependenciesMetadata (compiler.js:15662) at CompileMetadataResolver._getTypeMetadata (compiler.js:15497) at CompileMetadataResolver._getInjectableMetadata (compiler.js:15477) at CompileMetadataResolver.getProviderMetadata (compiler.js:15837) at eval (compiler.js:15748) at Array.forEach (<anonymous>) at CompileMetadataResolver._getProvidersMetadata (compiler.js:15708) at CompileMetadataResolver.getNgModuleMetadata (compiler.js:15276) at CompileMetadataResolver.getNgModuleSummary (compiler.js:15114)
該当のソースコード
- driver.ts
インターフェースの宣言
lang
1export interface Driver { 2}
- dao.ts
daoは引数にインターフェースでdriverを実装した実装クラスを受取る.
lang
1import { Injectable } from '@angular/core'; 2import { Driver } from './driver'; 3 4@Injectable() 5export class dao { 6 constructor(private accesor: Driver) 7 { /* 初期化処理 */ } 8}
- webapidriver.ts
driverインターフェースの実装クラス
lang
1import { Injectable } from '@angular/core'; 2import { Driver } from './driver'; 3 4@Injectable() 5export class WebAPIDriver implements Driver { 6 constructor() {} 7}
- service.ts
daoにdriverインターフェースを実装したWebAPIDriverをセット
lang
1import { Injectable } from '@angular/core'; 2import { WebAPIDriver } from './webapidriver'; 3import { DAO } from './dao'; 4 5@Injectable() 6export class service{ 7 8 constructor() { 9 /* WebAPIDriverはdirverインターフェースを実装 */ 10 var dao = new DAO(new WebAPIDriver()); 11 } 12}
試したこと
- Issuesを参考にpolyfills.tsの以下の行をコメントアウトしてみたが、エラーは同じで発生場所が変わっただけでした。
import 'core-js/es7/reflect';
- この記事でインスタンス生成時に、コンストラクタ引数に何渡せば良いかわらなくなってるという事でdaoのコンストラクタに
Inject
デコレータを付けてみました。あたりまえですが、WebAPIDriverを指定したら普通に動作しました。(やりたい事は出来てませんが)
import { Injectable, Inject } from '@angular/core'; //↑付け足す import { Driver } from './driver'; import { WebAPIDriver } from './WebAPIdriver'; // ↑ 付け足す export class dao { constructor( @Inject(WebAPIDriver) private accesor: Driver //↑付け足す ) { /* 初期化処理 */ } }
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。