0

AOP を使用して、Web サイトの BLL レイヤーのすべてのメソッドにキャッシュ機能を適用したいと考えています。以下のように:

[Cacheable(new string[] { "id" }, GroupName = "UserInfoByID", LiveTime = "00:05:00")]
public UserInfo GetUserInfoByID(int id)
{
    return UserDAO.GetUserInfo(id);
}

Cacheableattributeの最初の引数は、メソッドのどの引数を使用してキャッシュ キーを作成するかを決定します。2 番目の引数GroupNameは、キャッシュ キーのプレフィックスを計算します。上記の例のように、キー「UserInfoByID(123)」が生成されます (クエリ ID が 123 であると仮定)。別の属性を作成します。

[PurgeCache(new string[] { "userInfo.ID" }, GroupName = "UserInfoByID")]
public void UpdateUserInfo(UserInfo userInfo)
{
    UserDAO.UpdateUserInfo(userInfo);
}

userInfo.ID と同じ GroupName-UserInfoByIDを使用して同じキーを生成し、キャッシュを消去します: UserInfoByID(123)。使いやすくエレガントですか?しかし、非常に難しい問題があります。別の方法があります:

public void ManageUser(int[] userID, int status)
{
    UserDAO.ManageUser(userID, status);
}

このメソッドは、ユーザーのステータスを変更するために使用されます。実行後にキャッシュを更新するにはどうすればよいですか? キーをint[] userID1 つずつ生成し、すべてを消去する必要がありますか? 非常に単純なケースですが、高性能キャッシュを考慮すると複雑すぎますか。リストクエリメソッドがあるとします:

[Cacheable(new string[] { "regionID" }, GroupName = "UserList", LiveTime = "00:05:00")]
public List<UserInfo> GetUserList(int regionID)
{
    List<UserInfo> result = UserDAO.GetUserList(regionID);
    return result;
}

ユーザーのステータスを無効に変更した場合、上記の方法でキャッシュを更新するにはどうすればよいですか?

4

1 に答える 1

0

少し前に小さな aop キャッシング fw MbCacheを作成しました。ここで、無効化を構成の問題ではなく「明示的な」操作にすることにしました。物事がずっと簡単になりました。

この fw は属性ではなくコード構成を使用しますが (さまざまな理由で属性が好きではありません - 個人的な意見です)、ここでも同じことが適用できると思います。PurgeCacheAttribute を削除して、代わりにそれをランタイム操作/メソッドにする必要がありますか?

これは、MbCache で無効化が行われる方法です。おそらく、いくつかのアイデアが得られるでしょうか?

于 2012-08-15T07:43:06.730 に答える