MvcSiteMapProvider は、キャッシュの依存関係を解決する動的サイトマップを可能にします。
を実装するクラスを作成することで、これを有効にすることができますIDynamicNodeProvider
。以下は、データベース クエリに基づいて動的ノードを生成し、同じクエリにキャッシュ依存関係を設定する例です。
public class ProductNodesProvider : IDynamicNodeProvider
{
static readonly string AllProductsQuery =
"SELECT Id, Title, Category FROM dbo.Product;";
string connectionString =
ConfigurationManager.ConnectionStrings ["db"].ConnectionString;
/// Create DynamicNode's out of all Products in our database
public System.Collections.Generic.IEnumerable<DynamicNode> GetDynamicNodeCollection()
{
var returnValue = new List<DynamicNode> ();
using (SqlConnection connection = new SqlConnection(connectionString)) {
SqlCommand command = new SqlCommand (AllProductsQuery, connection);
connection.Open ();
SqlDataReader reader = command.ExecuteReader ();
try {
while (reader.Read()) {
DynamicNode node = new DynamicNode ();
node.Title = reader [1];
node.ParentKey = "Category_" + reader [2];
node.RouteValues.Add ("productid", reader [0]);
returnValue.Add (node);
}
} finally {
reader.Close ();
}
}
return returnValue;
}
/// Create CacheDependancy on SQL
public CacheDescription GetCacheDescription ()
{
using (SqlConnection connection = new SqlConnection(connectionString)) {
SqlCommand command = new SqlCommand (AllProductsQuery, connection);
SqlCacheDependency dependancy = new SqlCacheDependency (command);
return new CacheDescription ("ProductNodesProvider")
{
Dependencies = dependancy
};
}
}
}
これはすべて非常に気の利いたものであり、顧客がデータベース内の製品を変更したときにキャッシュを無効にする必要がありますが、全体SqlCacheDependancy
が複雑になる可能性があり、SQL Server のバージョンに依存します。
CacheDependacy
キャッシュを使用して製品を保存している場合は、代わりにカスタムを使用できます。