1

That question is continues my last question No provider for ObservableDataService

So, i have application wide service UploadedTemplatesService which must be singleton. That service have one dependency - ObservableDataService and that dependency must create for that singletone UploadedTemplatesService only once, but ObservableDataService can be used in other services too and that service must inject for each other services as new object each time.

Must important note - i want to use UploadedTemplatesService inside Route hook too, so i added to bootstrap .then method and inside .then add appRef.injector inside AppInjector function. AppInjector code:

```

export const AppInjector = (injector?: Injector): Injector => {
    if (injector) {
        appInjectorRef = injector;
    }
    return appInjectorRef;
};

```

So after that, i can get UploadedTemplatesService inside Route hook in way like Injector.get(UploadedTemplateService).

So, i looked at documentation and tryed to write something like

```

bootatrap(AppComponent, [
    provide(UploadedTemplatesService, {
        useFactory: () => {
            return new UploadedTemplatesService(new ObservableDataService());
        }
    })
])

```

But that code throw new error: Cannot read property 'getOptional' of undefined

What i done wrong?

Community
  • 1
  • 1

2 Answers2

0

I don't really understand what you try to do but if you want to use useFactory and also have ObservableDataService available in dependency injection, you should use something like that:

bootstrap(AppComponent, [
  ObservableDataService,
  provide(UploadedTemplatesService, {
    useFactory: (dataService: ObservableDataService) => {
      return new UploadedTemplatesService(dataService)
    },
    deps: [ObservableDataService]
 })
);

That said, by specifying UploadedTemplatesService and ObservableDataService providers at the bootstrap level you will have singletons for these services...

Thierry Templier
  • 198,364
  • 44
  • 396
  • 360
  • No, ObservableDataService must be not application wide. Only UploadedTemplateService, which has one dependency - ObservableDataService – Качалов Тимофей Feb 19 '16 at 13:45
  • Because each object of ObservableDataService can contain his own data. For example i want to create another application wide service BlablablaService, and that service will store his data inside his dependency ObservableDataService. ObservableDataService - just a collection based on rxjs – Качалов Тимофей Feb 19 '16 at 13:52
  • Okay, I think I understood what you try to do. But in this case, ObservableDataService can't take part into constructor-based dependencyclopédie injection... It seems to be what you want. Do you still try to inject this service somewhere in your application? – Thierry Templier Feb 19 '16 at 15:04
  • I still try to do that. About `Cannot read property 'getOptional' of undefined` error - i have no idea why that happens, because i do that like in Angular 2 documentation (example with V8 engine), but instead empty constructor i set ObservableDataService in constructor – Качалов Тимофей Feb 19 '16 at 16:12
  • Perhaps you forgot to import the `ObservableDataService` type ;-) – Thierry Templier Feb 19 '16 at 16:26
  • Let us [continue this discussion in chat](http://chat.stackoverflow.com/rooms/103979/discussion-between---and-thierry-templier). – Качалов Тимофей Feb 19 '16 at 17:31
  • No. But if i can't use ObservableDataService in DI - this so stupid limitation. In every app can be many application-wide (singletons) services, thats require other services as dependencies. – Качалов Тимофей Feb 19 '16 at 18:56
  • So you need to have a provider configured for it... And Angular2 will manage instances by itself. – Thierry Templier Feb 19 '16 at 19:04
  • provider, which will passed into bootstrap? I tried do that `provide(UploadedTemplatesService, { useFactory: () => { return new UploadedTemplatesService(new ObservableDataService()); } }) ` but it throw error. And i does not find any other ways to do that. – Качалов Тимофей Feb 19 '16 at 19:23
0
provide(ServiceA, {
    useValue: new ServiceA(new CollectionService<ServiceADataType>())
})

That works. So, why useFactory throws Cannot read property 'getOptional' of undefined error?