Angular — Dependency Inversion

Hernan Castilla
2 min readOct 17, 2021

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

--

--