Сервис Angular @Injectable не может передать ссылку на себя объектам, которые он создает - PullRequest
0 голосов
/ 02 октября 2018

Я пытаюсь заключить вызовы службы в объект, созданный этой же службой.Моя цель - использовать полиморфизм, поэтому в компоненте, когда я вызываю метод accept() или refuse() моих унаследованных классов Request, он вызывает соответствующий метод моего сервиса на основе типа подкласса Request.Для этого я подумал, что мог бы создать экземпляры этих Request объектов из этого сервиса и передать ссылку на себя на экземпляры объектов, используя аргументы их конструктора, но это не работает.

Проблема, с которой я столкнулся, заключается в том, что когда я вызываю refuse() или accept() во время выполнения для этих объектов, созданных таким образом, ссылка на службу не содержит методы службы.

Мой сервис заполняет список Request объектами подклассов, которые он создает с данными и ссылкой на себя, например:

    @Injectable()
    export class RequestServiceMock extends RequestService { 
    ....
    mapRequestData(requestData: IRequest[]): Request[]{
            if(!this.requests)
                this.requests = [];
            else
                this.requests.splice(0, this.requests.length);
            if ( requestData ) {
                requestData.forEach(( r: IRequest ) => {
                    switch ( r.type ) {
                        case Request.TYPE_CONTACT:
                            this.requests.push( new ContactRequest( r, this ) );
                            break;
                        case Request.TYPE_INFORMATION:
                            this.requests.push( new InformationRequest( r, this ) );
                            break;
                        case Request.TYPE_RESOURCE:
                            this.requests.push( new ResourceRequest( r, this ) );
                            break;
                        case Request.TYPE_TRANSACTION_ACKNOWLEDGEMENT:
                            this.requests.push( new TransactionAcknowlegmentRequest( r, this ) );
                            break;
                    }
                } );
                return this.requests;
            }
        }
    ....
    acceptResourceRequest( request: ResourceRequest ): Observable<any> {
       ...
    }

    refuseResourceRequest( request: ResourceRequest ): Observable<any> {
       ...
    }

    respondInformationRequest( request: InformationRequest ): Observable<any> {
        ...
    }

    rejectInformationRequest( request: InformationRequest ): Observable<any> {
        ...
    }
...
    }

A Request подкласс выглядит следующим образом:

export class ResourceRequest extends Request {

    resourceRef: string;
    responseText: string;

    constructor(request: IRequest, requestService: RequestService) {
        super(request, requestService);
        if(request) {
            this.resourceRef = request.resourceRef;
            this.responseText = request.responseText;
        }
    }

    accept(): Observable<any> {
        return this.requestService.acceptResourceRequest(this);
    }

    reject(): Observable<any> {
        return this.requestService.refuseResourceRequest(this);
    }

}

Мои вопросы:

  1. Есть ли способ заставить этот дизайн с полиморфизмом работать под углом, и если да, то как?
  2. Если я не могу использоватьКаков наилучший способ справиться с хорошим сервисным вызовом в зависимости от типа запроса?
...