多型を使用するときに2レベルのキャッシュを粒状制御する方法
-
26-10-2019 - |
質問
私は約40のクラスを持っています、そして、それらはすべてインターフェイスのientityを実装しています。
〜40のクラスのうち、多くのクラスがIENTITYプロパティに「多面」マッピングを使用しています。この例は次のとおりです。
"IEntity.cs"
public interface IEntity
{
Guid ID
...Other properties (~7 of them)
}
"Item.cs"
public class Item : IEntity
{
Public Guid ID {get;set;}
...Other IEntity Properties
Public IEntity Owner {get;set;}
}
私は、nhibernateを使用して所有者のプロパティをアイテムにマッピングすると信じています。私は、baseとしてientityを使用して、Nhibernateの継承マッピングの1つを使用する必要があります。
問題は、2番目のレベルのキャッシュの構成が、サブクラスではなくクラス定義に関連付けられていることです。一度にモデルの40クラスすべてのキャッシュをオンにする必要があり、カテゴリなど、必要なクラスをキャッシュすることはできません。
2番目のレベルのキャッシュの選択を行う能力を失うことなく、抽象的なエンティティのタイプであるプロパティを持つエンティティをどのようにマップできるかを知っていますか?
解決
まず、プロパティのタイプをとして定義するというアイデアが本当に得られるかどうかはわかりません IEntity
- 大丈夫ですか? Item
別のアイテムの所有者になるには?それは大丈夫ですか? Employee
アイテムの所有者になるには?
答えが「はい」であり、それがあなたのシステムのビジネスロジックである場合、これについて何もすることはありません。
それ以外の場合 - あなたはそれを定義するのに役立つかもしれません IOwner
またはa OwnerBase
その区別を支援するベースクラス。
これは、どのクラスをキャッシュするか、どのクラスがそうでないかを説明することにも役立つかもしれません。
そして今、キャッシュの質問に:
2番目のレベルのキャッシュの定義は、2つの場所で発生する必要があります。
1.クラスのマッピング
2.協会マッピング
あなたの場合、私はあなたが実際にすべてのために2番目のレベルのキャッシュをオンにする必要があると信じています IEntity
クラス。 しかし キャッシュをオンにするだけの場合 明確な 関連性、その後、それらの協会のみがキャッシュされます。
(これの例外は使用です Get<T>()
また Load<T>()
また、オブジェクトをキャッシュします。私が間違っていなければ、あなたはnhibを伝えることができます いいえ 特定のクエリにキャッシュを使用するには)