0

私は AOP を学んでおり、ポイントカット、アドバイスなどに慣れています。何を尋ねようとしているのか、不可能だと確信していますが、とにかく尋ねたいと思っています。

userId を取得し、データベースからユーザーのレコードをフェッチして、レコードに対して何かを行うメソッドがあります。さまざまなことを行う 20 の異なるメソッドがありますが、それらはすべて userId を入力として受け取り、データベースからレコードを取得します。私には、これはある側面に引き込むことができる横断的な関心事のように見えます。

しかし、どのように?引数 (この場合は userId) にアクセスし、メソッドの戻り値にアクセスして、メソッドの例外をキャッチできることはわかっています。しかし、メソッドに何かを与えるにはどうすればよいですか(この場合、データベースに記録しますか?)

public String printUserDetails(String userId)
{
    Record record = Database.fetchRecord(userId);
    System.out.println(record.getDetails());
    return record.getTitle();
}

では、そのデータベース アクセス コードをアスペクトに取り込む方法はありますか?

私が考えることができる1つの方法は、入力に対して次のようなものを宣言することです

class RequestObject
{
    String userId;
    Record record;
}

アスペクトにレコードを挿入してから、proced() を呼び出します。しかし、これはどういうわけか間違っているように感じます。

4

2 に答える 2

1

ユーザーIDを使用してユーザーを解決するIMOは、分野横断的な問題ではないため、アスペクトは正しい方法ではありません。userId を受け取る最初のランディング ページは、実際にはそれを UserRecord に解決する必要があり、それ以降は、userRecord がアプリケーション内を移動するページになります。

私のアプリケーションの 1 つからシナリオに引き出せる簡単なアナロジーは、認証されたすべてのサーブレットが、リクエストを送信したユーザーに対応する有効なユーザー ログインを返すことを servletRequest.getRemoteUser() に期待することです。これをアプリケーションの User オブジェクトに解決するようにをデコレートしHttpServletRequest、すべての認証済みサーブレットが をダウンキャストしHttpServletRequestAuthenticatedServletRequestこのオブジェクトを抽出します。アプリケーション内の誰もユーザー ログインを解決しようとしなくなります。

于 2012-09-21T09:45:32.380 に答える
0

これが知りたいのであれば、AspectJからメソッドのローカル変数にアクセスすることはできません。

残りの質問は、デザインと、達成したいことに応じた答えについてです。テンプレートメソッドデザインパターンを使用すると、複数のメソッドでのコードの重複を回避できます。ローカル変数の代わりにメンバーを持つようにリファクタリングすると、実オブジェクトまたはモックオブジェクトをクラスに挿入できます。クラスを直接リファクタリングするか、AspectJ(ITD)を介してメンバーを作成するかどうかは別の質問です[http://www.eclipse.org/aspectj/doc/next/progguide/starting-aspectj.html#inter-type-declarations ]メカニズム。3番目の質問は、データベースから同じオブジェクトを複数回フェッチすることを回避するために、キャッシュのアスペクトを使用する可能性があるかどうかです。

あなたが何を達成したいのか正確にはわからないので、これ以上具体的に答えることはできません。

于 2012-09-22T08:17:03.930 に答える