前編-Asp.netあなたに(a)の簡単な紹介をキャッシュを使用
- キャッシュとは何ですか
- なぜ使用のキャッシング
- 単純な
HttpRuntime.Cache
キャッシュ・メカニズムを使用します
このプログラムは、キャッシュを共有することがより弾力になります
第二のアウトライン
- 提案インタフェース、交換性を向上させます
- キャッシュ読み出しモードを書き換えて、一般的な使用
- キャッシュを書き換えるために、拡張メソッドを使用します
- 提案インタフェース、交換性を向上させます
状況:
現在使用してそこに突出している HttpRuntime.Cache
オブジェクトを
Asp.Netにキャッシュメモリを使用することに加えてHttpRuntime.Cache
外部のクラスは、そのような使用など多くのソリューションがあるのMemcache、Redisのは ...
私たちは、元の使用している場合はHttpRuntime.Cache
、クラスをが、その後、彼らは他のキャッシュウェイに有効にする必要がありますどのようにしますか?
public class HomeController : Controller
{
System.Web.Caching.Cache cacheContainer = HttpRuntime.Cache;
public ActionResult Index()
{
string cacheData = cacheContainer.Get("data") as string;
if (cacheData==null)
{
cacheContainer.Insert("test1", DateTime.Now.ToShortDateString());
}
return View(cacheData);
}
}
異なるキャッシュウェイの使用は、しかし、私は私の最後の記事は、に焦点を当てた覚えがリーディング、ライティング、二つの作用を持つことになりますキャッシュ、その基本的な読み取りがあるでしょうし、これら二つの書き込みアクションを
OOPはで非常に重要な概念た 複数のクラスは、反復動作の親を行うことを検討する必要があります
理解を容易にするために私が入れHttpRuntime.Cache
クラスにパッケージを
public class NetCache {
System.Web.Caching.Cache cacheContainer = HttpRuntime.Cache;
public object GetCacheObject(string key) {
return cacheContainer.Get(key);
}
public void SetCache(string key,object obj) {
cacheContainer.Insert(key, obj);
}
}
ここでは別の存在であるMemcache
キャッシュクラス
public class MemeryCache {
private ObjectCache _cache = MemoryCache.Default;
public object GetCacheObject(string key)
{
return _cache[cacheKey];
}
public void SetCache(string key, object obj)
{
var policy = new CacheItemPolicy();
policy.RemovedCallback = OnFileContentsCacheRemove;
// 设定缓存时间2分钟
policy.AbsoluteExpiration = DateTimeOffset.Now.Minute(2);
_cache.Set(cacheKey, fileContents, policy);
}
}
詳細内部これら二つのオブジェクトに焦点を当てていないために、我々は、彼らがすべて持っていることがわかります GetCacheObject
方法やSetCache
方法を
その後、我々はやがて用に提案できるインターフェイス(インターフェイス)契約のこの2つのクラスとして、
public interface ICache {
void Set(string key,object obj);
object Get(string key);
}
その2クラスが実装した後 ICache
のインタフェースを
public class MemeryCache : ICache
{
private ObjectCache _cache = MemoryCache.Default;
public object Get(string key)
{
return _cache[cacheKey];
}
public void Set(string key, object obj)
{
var policy = new CacheItemPolicy();
policy.RemovedCallback = OnFileContentsCacheRemove;
// 设定缓存时间2分钟
policy.AbsoluteExpiration = DateTimeOffset.Now.Minute(2);
_cache.Set(cacheKey, fileContents, policy);
}
}
public class NetCache : ICache
{
System.Web.Caching.Cache cacheContainer = HttpRuntime.Cache;
public object Get(string key) {
return cacheContainer.Get(key);
}
public void Set(string key,object obj) {
cacheContainer.Insert(key, obj);
}
}
インターフェース提案利点は何ですか?
私たちは、目の前にプログラムを変更することができIOC依存性注入プログラムにハードコーディングされ使用していない、道HttpRuntime.Cache
注入プログラムをターゲットに私たちを助けるためにIOCコンテナによって。
注意:私は、コンストラクタ・インジェクション方式を使用します
public class HomeController : Controller
{
//不用写死使用 HttpRuntime.Cache
//System.Web.Caching.Cache cacheContainer = HttpRuntime.Cache;
ICache cacheContainer;
public HomeController(ICache Container){
cacheContainer = Container;
}
public ActionResult Index()
{
string cacheData = cacheContainer.Get("data") as string;
if (cacheData==null)
{
cacheContainer.Insert("test1", DateTime.Now.ToShortDateString());
}
return View(cacheData);
}
}
ICache
プログラムをより柔軟にすることができますプログラムの潤滑剤をキャッシュになります
- キャッシュ読み出しモードを書き換えて、一般的な使用
私の答えはStackOverflowの第二の方法であります
最も重要な技術であるGet
メソッドが返すObject
ジェネリック医薬品の使用に
public T GetOrSetCache
(string key,T obj, int cacheTime) where T:class,new()
{
System.Web.Caching.Cache cacheContainer = HttpRuntime.Cache;
T cacheObj = cacheContainer.Get(key) as T;
if (cacheObj == null)
{
cacheContainer.Insert(key,
obj,
null,
DateTime.Now.AddMinutes(cacheTime),
System.Web.Caching.Cache.NoSlidingExpiration);
cacheObj = obj;
}
return cacheObj;
}
私たちはなることができます使用してみましょう
var data = DateTime.Now.ToShortDateString();
int numberOfMinutes = 3;
data = GetOrSetCache("name1",data,numberOfMinutes );
私達はちょうど呼び出す必要がGetOrSetCache
方法、GetCache
およびSetCache
パッケージアップを
- キャッシュを書き換えるために、拡張メソッドを使用します
.NETは非常に便利なメカニズムを提供している 拡張方法、私たちは非常に重要な問題を解決するには、このメカニズムを。
我々はできるパッケージを展開するが、クラスのソースコードを持っていませんでした、
この手順の間、使用することは、 使用することができます プログラムは、より簡潔にするために、式を!!Func
lambda
public static TObj GetOrSetCache
(this Func
selector, string key, int cacheTime) where TObj : class
{
Cache cacheContainer = HttpRuntime.Cache;
//get cache Object
var obj = cacheContainer.Get(key) as TObj;
//if there isn't cache object add this object to cache
if (obj == null)
{
obj = selector();
cacheContainer.Insert(key, obj);
}
return obj;
}
私たちが使用する場合は、次の
より美しく簡潔なアクションを変更
int numberOfMinutes = 3;
data = GetOrSetCache(()=> DateTime.Now.ToShortDateString(),"name1",data,numberOfMinutes );
プラスフィールドのマッピングを持ちます:
拡張メソッドとインターフェースを用いて
public class WebDefaultCache : ICache
{
Cache cacheContainer = HttpRuntime.Cache;
public object Get(string key)
{
return cacheContainer.Get(key);
}
public void Set(string key, object obj)
{
cacheContainer.Insert(key, obj);
}
}
public interface ICache{
void Set(string key, object obj);
object Get(string key);
}
public static class InfrastructureExtension
{
public static TObj GetOrSetCache
(this Func
selector, string key) where TObj : class {
return GetOrSetCache(selector, key,10);
}
public static TObj GetOrSetCache
(this Func
selector, string key, int cacheTime) where TObj : class
{
return GetOrSetCache(selector, key, cacheTime, new WebDefaultCache());
}
public static TObj GetOrSetCache
(this Func
selector, string key, int cacheTime, ICache cacheContainer) where TObj : class { //get cache Object var obj = cacheContainer.Get(key) as TObj; //if there isn't cache object add this object to cache if (obj == null) { obj = selector(); cacheContainer.Set(key, obj); } return obj; } }
第三の使用とは、などが、
まだ私たちは多くの使用を持っているメソッドのオーバーロードパスよりも多くのパラメータICache
インタフェースは、私たちは、あなたがプログラムを書くときに、プログラムを変更することが行っていない、キャッシュを使用したい方法を決定することができます。
プラスフィールドのマッピングプログラムで私は自分の共通入れExtenionToolのプロジェクトを
あなたはこの記事が役に立ったと評価していた場合は、隅石を支払うことができます^^内紛を奨励します
オリジナル:ビッグボックス Asp.net使用のキャッシング(B)