11import {
2+ Inject ,
23 Injectable ,
4+ InjectionToken ,
35 Injector ,
46} from '@angular/core' ;
57import {
@@ -9,10 +11,15 @@ import {
911 RouterStateSnapshot ,
1012} from '@angular/router' ;
1113import { Observable } from 'rxjs' ;
14+ import { switchMap } from 'rxjs/operators' ;
1215
13- import { getDataServiceFor } from '../../../core/data/base/data-service.decorator' ;
16+ import {
17+ APP_DATA_SERVICES_MAP ,
18+ LazyDataServicesMap ,
19+ } from '../../../../config/app-config.interface' ;
1420import { IdentifiableDataService } from '../../../core/data/base/identifiable-data.service' ;
1521import { RemoteData } from '../../../core/data/remote-data' ;
22+ import { lazyService } from '../../../core/lazy-service' ;
1623import { DSpaceObject } from '../../../core/shared/dspace-object.model' ;
1724import { getFirstCompletedRemoteData } from '../../../core/shared/operators' ;
1825import { ResourceType } from '../../../core/shared/resource-type' ;
@@ -23,12 +30,11 @@ import { isEmpty } from '../../empty.util';
2330 */
2431@Injectable ( { providedIn : 'root' } )
2532export class ResourcePolicyTargetResolver implements Resolve < RemoteData < DSpaceObject > > {
26- /**
27- * The data service used to make request.
28- */
29- private dataService : IdentifiableDataService < DSpaceObject > ;
3033
31- constructor ( private parentInjector : Injector , private router : Router ) {
34+ constructor (
35+ private parentInjector : Injector ,
36+ private router : Router ,
37+ @Inject ( APP_DATA_SERVICES_MAP ) private dataServiceMap : InjectionToken < LazyDataServicesMap > ) {
3238 }
3339
3440 /**
@@ -46,13 +52,13 @@ export class ResourcePolicyTargetResolver implements Resolve<RemoteData<DSpaceOb
4652 this . router . navigateByUrl ( '/404' , { skipLocationChange : true } ) ;
4753 }
4854
49- const provider = getDataServiceFor ( new ResourceType ( targetType ) ) ;
50- this . dataService = Injector . create ( {
51- providers : [ ] ,
52- parent : this . parentInjector ,
53- } ) . get ( provider ) ;
55+ const resourceType : ResourceType = new ResourceType ( targetType ) ;
56+ const lazyProvider$ : Observable < IdentifiableDataService < DSpaceObject > > = lazyService ( this . dataServiceMap [ resourceType . value ] , this . parentInjector ) ;
5457
55- return this . dataService . findById ( policyTargetId ) . pipe (
58+ return lazyProvider$ . pipe (
59+ switchMap ( ( dataService : IdentifiableDataService < DSpaceObject > ) => {
60+ return dataService . findById ( policyTargetId ) ;
61+ } ) ,
5662 getFirstCompletedRemoteData ( ) ,
5763 ) ;
5864 }
0 commit comments