Angular — Dependency Inversion
La idea es poder desacoplar todos esos servicios externos que utilizamos y que resulte sencillo cambiar sus implementaciones sin hacer cambios drásticos en nuestros componentes.
Vamos al ejemplo, sencillo pero sustancioso.
Definiendo clases:
export abstract class Writer {
abstract write: (text: string) => string;
}
Creamos las implementaciones y definimos detalles, es un ejemplo sencillo, pero se logra entender la idea.
class WriterUpper extends Writer {
write = (text: string): string => {
return text.toUpperCase();
};
}class WriterLower extends Writer {
write = (text: string): string => {
return text.toLowerCase();
};
}
Lo siguiente que debemos hacer es utilizar la inyección de dependencias de angular para definir la implementación que se instanciara cuando hagamos referencia a la clase Writer.
providers: [{
provide: Writer,
useClass: WriterUpper,
}, ]
app.module.ts
import {
NgModule
} from '@angular/core';
import {
BrowserModule
} from '@angular/platform-browser';import {
AppComponent
} from './app.component';export abstract class Writer {
abstract write: (text: string) => string;
}class WriterUpper extends Writer {
write = (text: string): string => {
return text.toUpperCase();
};
}class WriterLower extends Writer {
write = (text: string): string => {
return text.toLowerCase();
};
}@NgModule({
declarations: [AppComponent],
imports: [BrowserModule],
providers: [{
provide: Writer,
useClass: WriterUpper,
}, ],
bootstrap: [AppComponent],
})
export class AppModule {}
Listo, tenemos todo lo necesario, vamos al componente.
app.component.ts
export class AppComponent {
title = 'Dependency Inversion';constructor(private writer: Writer) {
this.title = this.writer.write(this.title);
}
}
app.component.html
<h1>
{{title}}
</h1>
providers: [{
provide: Writer,
useClass: WriterLower,
}, ],
Pero compartir no es inmoral –es un imperativo moral. Sólo aquellos que están cegados por la codicia se negarían a hacerle una copia a un amigo.
— Aaron Swartz