Asp.netキャッシュ(II)を使用します

前編-Asp.netあなたに(a)の簡単な紹介をキャッシュを使用

  1. キャッシュとは何ですか
  2. なぜ使用のキャッシング
  3. 単純なHttpRuntime.Cacheキャッシュ・メカニズムを使用します

このプログラムは、キャッシュを共有することがより弾力になります


第二のアウトライン

  1. 提案インタフェース、交換性を向上させます
  2. キャッシュ読み出しモードを書き換えて、一般的な使用
  3. キャッシュを書き換えるために、拡張メソッドを使用します

  1. 提案インタフェース、交換性を向上させます

状況:

現在使用してそこに突出している  HttpRuntime.Cache オブジェクトを

Asp.Netにキャッシュメモリを使用することに加えてHttpRuntime.Cache外部のクラスは、そのような使用など多くのソリューションがあるのMemcacheRedisのは ...

私たちは、元の使用している場合は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 プログラムをより柔軟にすることができますプログラムの潤滑剤をキャッシュになります


  1. キャッシュ読み出しモードを書き換えて、一般的な使用

私の答えは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パッケージアップを


  1. キャッシュを書き換えるために、拡張メソッドを使用します

.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)


おすすめ

転載: www.cnblogs.com/chinatrump/p/11490798.html