如何在Angular 2中实现AOP

8

我是一名新手在Angular 2中,但我对Angular 1.x有很好的经验。

我遇到了以下错误:

无法找到模块'aspect.js/dist/lib/aspect'

以下是我的代码:

logging.aspect.ts

import {Injectable} from '@angular/core';
import {beforeMethod, Metadata} from 'aspect.js/dist/lib/aspect';
@Injectable()
export class LogAspect {

  @beforeMethod({
    classNamePattern: /(Matter|Customer)Service/,
    methodNamePattern: /^(get)/
  })
  invokeBeforeMethod(meta: Metadata) {
    console.log(`Inside of the logger.
      Called ${meta.className}.${meta.method.name}
      with args: ${meta.method.args.join(', ')}.`
    );
  }
}

Aspect 定义了一个建议,该建议应用于所有以 get 开头的方法调用,这些方法调用在其名称中含有 regex 模式 (Matter|Customer)Service 的类中。该建议可用于元数据,其中包含实际方法名称和类名称以及方法调用参数。

invoice.service.ts

import {Injectable} from '@angular/core';
import {Http} from '@angular/http';
import {Observable} from 'rxjs/Observable';
import 'rxjs/Rx';
import {Wove} from 'aspect.js/dist/lib/aspect';
import {Matter} from './Matter.model';
@Injectable()
@Wove()
export class MatterService{
  private url: string;
  constructor(private http: Http) {
    this.url = '/data/matters/data.json';
  }
  get(): Observable<Matter[]> {
    return this.http.get(this.url)
      .map(
        (response) => <Matter[]>response.json()
      );
  }
}

请提供在Angular2中实现AOP的其他方法。


你是否正在使用Angular 2的新AOT编译器?AOT会破坏第三方装饰器,但我认为他们正在努力解决这个问题。在JIT下运行时,我的自定义装饰器可以完美地工作。我意识到装饰器和AOP是正交的,但由于您正在使用装饰器语法,请知道它与AOT不兼容,因为AOT会在一个称为降级的过程中擦除装饰器,并将其转换为静态元数据(这可能已经部分解决了)。 (欢迎来到AOT:TypeScript与被擦除的装饰器和试图被重新定义但在JavaScript“类型”中失败的愚蠢想法) - Aluan Haddad
你可以在 https://github.com/mgechev/aspect.js 上提出问题。Minko Gechev 在 Angular 中也非常活跃。 - Alex JM
1个回答

2

你尝试过kaop-ts吗?我发现它更直观易用,而且在我们公司的项目中也起到了很好的作用。

// LogAspect.ts    
export class LogAspect {
  static log(meta) {
    console.log('Called: ', meta.target)
    console.log('Args: ', meta.args)
  }
}

// YourService.ts
import { Injectable } from '@angular/core'
import { beforeMethod } from 'kaop-ts'
import { LogAspect } from './LogAspect'

@Injectable()
export class YourService {
  @beforeMethod(LogAspect.log) 
  get() {
    // ....
  }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接