Внедрение зависимостей, создающих новый объект при каждом вызове api

#node.js #typescript #inversifyjs

#node.js #typescript #inversifyjs

Вопрос:

Каждый раз, когда я вызываю api на сервере inversify-express, зависимость каждый раз создает новый объект

 var kernel=new Kernel();
kernel.bind<interfaces.Controller>(TYPE.Controller).to(SyncController).whenTargetNamed(TAGS.SyncController);
kernel.bind<DB_SyncDataDAO>(TYPES.DB_SyncDataDAO).to(DB_SyncDataDAO_Impl);
kernel.bind<SyncService>(TYPES.SyncService).to(SyncService_Impl);
  

Всякий раз, когда я вызываю api, он каждый раз создает новый объект каждой зависимости

Комментарии:

1. И ваш вопрос?

2. Вы решили эту проблему? Можете ли вы опубликовать ответ или пометить один из приведенных ниже ответов как действительный?

Ответ №1:

Я предполагаю, что вы хотите, чтобы некоторые зависимости в вашем графе объектов были одиночными. Вы можете сделать это, используя inSingletonScope при объявлении привязки:

 kernel.bind<interfaces.Controller>(TYPE.Controller)
      .to(SyncController)
      .whenTargetNamed(TAGS.SyncController)
      .inSingletonScope();

kernel.bind<DB_SyncDataDAO>(TYPES.DB_SyncDataDAO)
      .to(DB_SyncDataDAO_Impl)
      .inSingletonScope();

kernel.bind<SyncService>(TYPES.SyncService)
      .to(SyncService_Impl)
      .inSingletonScope();
  

В качестве дополнительного примечания (не связанного с вашим вопросом), если DB_SyncDataDAO_Impl это экземпляр (класс nota), тогда вам следует использовать

 kernel.bind<T>("T").toConstantValue(instanceOfT)
  

Вместо:

 kernel.bind<T>("T").to(classWhichIsAnImplementationOfT)
  

При использовании toConstantValue , inSingletonScope не требуется, поскольку постоянные значения по умолчанию ведут себя как одиночные.

Надеюсь, это поможет 🙂