typescript - Resetarea containerului scoped în inversifyjs


Implementez o arhitectură de tip container cu domeniu limitat astfel încât un nou container să fie creat pentru fiecare cerere Express (sau cerere apollographql). Am o metodă de ciclu de viață care poate fi apelată după ce am terminat de trimis răspunsul, ceea ce este util pentru curățare și eliberarea memoriei, și această metodă poate face referire la contextul cererii pe care am terminat-o de servit. În acel context am o referință la containerul inversifyjs pe care l-am creat anterior, astfel încât să pot face referire la acel container în metoda de curățare, cum pot șterge acel container?

function ScopedContainer(userId: number) {
  const container = new Container();
  container.bind<number>(TYPES.userId).toConstantValue(userId);
  //rest of bindings container.bind ...
  return container;
}

async({req, res}) => {
  const { headers } = req;
  const { userId } = headers;
  const container = ScopedContainer(clientId);
  const context = { container }
  ///...
}

willSendResponse(({container}) => {
  // how to instruct inversifyjs to ditch all references to container?
  // something like container.destroy?
});


Vreau să mă asigur că acest container nu va rămâne acolo după ce cererea http este terminată, cauzând o scurgere mare de memorie. Problema este că nu sunt sigur că va fi colectat de garbaje atunci când numărul de referințe ajunge la zero. De asemenea, folosesc lazyInject din inversify-inject-decorators

Există vreo API container în inversifyjs precum metoda destroy sau reset?

Răspuns #1

Nu există o referință persistentă la instanța containerului în biblioteca inversify. Aceasta este referită temporar de Context în metoda privată _planAndResolve, dar este eliberată la întoarcere, așa că nu este motiv de îngrijorare.

Conceptual, o instanță de container ar trebui să fie rezolvatorul de nivel superior. Toate celelalte servicii din sistem sunt cumva „deținute” de container, dar nimeni nu ar trebui să dețină containerul decât codul utilizatorului.

Pe scurt, atâta timp cât respecți regula: folosește container doar în rădăcina compoziției tale, precum în inversify.config.ts, ești în siguranță.

În exemplul tău nu este atât de evident câte alte entități obțin referința la container. Dacă singurul obiect context pe care îl transmiți prin middlewares Express este acesta, atunci de îndată ce gestionarea cererii este terminată, context este dereferențiat și la fel și container, așteptând GC. Nu este necesară nicio altă „curățare” ulterioară.