5

आज मैंने कुछ ऐसा ठोकर खाया जो मुझे नहीं लगता था कि मुझे परेशानी होगी।कोणीय 2 इंजेक्शन योग्य इंटरफ़ेस?

जावा और स्प्रिंग में, मैं दो बीन्स घोषित कर सकता हूं जो दोनों एक दिए गए इंटरफेस को लागू करते हैं, जबकि दूसरी कक्षा में जहां उन्हें इंजेक्शन दिया जाता है, मैं केवल इंटरफ़ेस के साथ काम करता हूं; यह वास्तव में मुझे आईओसी के साथ क्या पसंद है: आपको वास्तव में यह नहीं पता होना चाहिए कि आप किस वस्तु के साथ काम कर रहे हैं, केवल दया है।

webapp.module.ts:

... 
import { WebAppConfigurationService } from './app/services/webapp.configuration.service'; 

@NgModule({ 
    ... 
    providers: [WebAppConfigurationService] 
}) 
export class AppModule { } 

tnsapp.module.ts:

... 
import { TnsConfigurationService } from './services/tns.configuration.service'; 

@NgModule({ 
    ... 
    providers: [TnsConfigurationService] 
}) 
export class AppModule { } 

तो मेरी छोटी Angular2/टाइपप्रति कार्यक्रम में, मैं भी ऐसा ही करने की कोशिश कर रहा था

इन दोनों मॉड्यूल एक अलग प्रदाता का उपयोग कर रहे हैं: TnsConfigurationService या WebAppConfigurationService

हालांकि, इन दो @Injectable सेवाएं एक ही इंटरफ़ेस को लागू:

configuration.interface:

export interface IConfigurationService { 
    ... 
} 

अंत में, मेरी घटकों में से एक में, मैं इन मॉड्यूल मैं पता चला है में से एक द्वारा प्रदान की इंजेक्शन का उपयोग आप शुरुआत में:

import { IConfigurationService } from './configuration.interface'; 

export class HeroesService { 

    constructor(private configurationService: IConfigurationService) { } 
} 

मेरी उम्मीद थी कि यह अंतिम घटक सही सेवा के साथ इंजेक्शन दिया जा रहा है, भले ही पैरा मीटर केवल स्पष्ट रूप से इंटरफ़ेस को परिभाषित कर रहा है। बेशक मुझे एक त्रुटि मिलती है ("त्रुटि: HeroesService के लिए सभी पैरामीटर को हल नहीं कर सकता")

अब, मुझे इसके लिए एक आसान समाधान की उम्मीद नहीं है क्योंकि यह वास्तुकला की कमी के रूप में लगता है। लेकिन शायद कोई मुझे वैकल्पिक डिजाइन के लिए इंगित कर सकता है?

+0

डी दस्तावेज़ीकरण पर एक नज़र डालें https://angular.io/docs/ts/latest/guide/dependency-injection.html#typescript-interfaces-aren-t-valid-tokens – yurzui

+0

@yurzui मुझे यह पसंद है: " यह कोणीय की गलती नहीं है। " :-) ठीक है, शायद यह करने के लिए अभी भी एक सुंदर तरीका है ... मैं बाद में इस 'ओपेक टोकन' – Sebas

+0

के बारे में पढ़ूंगा ओपेक टोकन मुख्य रूप से गैर-वर्ग प्रदाताओं (कारखानों और मूल्यों) के लिए है। – estus

उत्तर

6

प्रदाता को इंजेक्शन देने के लिए, इसे प्रदाता के रूप में पंजीकृत किया जाना चाहिए। IConfigurationService प्रदाता नहीं है। और यह प्रदाता नहीं हो सकता है, क्योंकि इंटरफेस संकलित जेएस कोड में मौजूद नहीं है।

abstract class ConfigurationService { ... } 

@Injectable() 
class WebAppConfigurationService extends ConfigurationService { ... } 

... 
providers: [{ provide: ConfigurationService, useClass: WebAppConfigurationService }] 
... 

यह नुस्खा सामान्यतः कोणीय 2 ही है, उदा प्रयोग किया जाता है:

इंटरफेस है कि प्रदाता टोकन के रूप में प्रयोग की जाने वाली अपेक्षा की जाती है के लिए आम बात सार कक्षाएं हो रहा है abstract NgLocalization class और concrete NgLocaleLocalization implementation

+0

यह वास्तव में अच्छा लगता है, मैं आपको कल सुबह पोस्ट कर दूंगा (यूटीसी) – Sebas

+0

https://cdn.meme.am/cache/instances/folder556/64985556.jpg – Sebas

+0

क्या यह अभी भी कोणीय 4/5 के लिए अद्यतित है? जावा जैसी डी को गले लगाने वाली अन्य भाषाओं से आने पर मुझे प्रदाताओं के रूप में अमूर्त वर्गों का उपयोग करने के लिए वास्तव में अजीब लगता है। –

संबंधित मुद्दे