ウェブサイトのメニューを作成しようとしています。以下の要件を満たす必要があります
- メニュー構造を構築するためにDBからデータを引き出して、データベース駆動型でなければなりません
- DB からプルされるデータはキャッシュする必要があります - ページ要求ごとに DB にアクセスしたくありません
現時点では、単純な例を実行していますが、キャッシュを統合する方法がわかりません。これを行う方法全体を作り直す必要があるかもしれないと思います。ここにあります:
DB からデータを取得し、ViewData に格納する ProductMenuAttribute があります。
public class ProductMenuAttribute: FilterAttribute, IActionFilter
{
#region IActionFilter Members
public void OnActionExecuted(ActionExecutedContext filterContext)
{
if (filterContext != null)
{
var context = filterContext.Result as ViewResult;
if (context != null)
{
ProductsRepository repository = new ProductsRepository(Properties.Settings.Default.SqlConnectionString);
context.ViewData.Add("ProductsList", repository.GetAllProductRanges());
}
}
}
public void OnActionExecuting(ActionExecutingContext filterContext)
{
}
#endregion
}
私のSite.masterでは、ViewDataからデータを取得し、それを使用してメニューをレンダリングします。これは、順序付けされていないメニュー リストの小さなスニペットで、CSS を使用してスタイルが設定されます。コードは次のとおりです。
<li>
<%= Html.ActionLink("Products", "Index", "Products")%>
<% IQueryable<ProductRange> productRanges = ViewData["ProductsList"] as IQueryable<ProductRange>; %>
<% if (productRanges != null)
{ %>
<ul>
<% foreach (ProductRange range in productRanges)
{ %>
<li><%= Html.ActionLink(range.Name, "RangeDetails", "Products", new { id = range.ID }, null)%></li>
<% } %>
</ul>
<% } %>
</li>
次に、次のように[ProductMenu]属性を使用して各コントローラーを装飾します。
[ProductMenu]
public class HomeController : BaseController
{
public ActionResult Index()
{
return View();
}
public ActionResult About()
{
return View();
}
}
これで、コントローラーのいずれかのアクションがヒットするたびに、 ProductMenuAttributeクラスのOnActionExecutedメソッドが呼び出され、ViewData が設定され、最終的にSite.Masterで使用されて DB からメニューが構築されます。私はアクションのいずれかを呼び出します。
今の問題は、このシナリオにキャッシュを追加するにはどうすればよいですか?? どこから始めればよいのか見当もつかないし、私が持っている解決策はキャッシュ可能ではないと感じています。