2009-05-16 41 views
15

ile özel bir önbellek sağlayıcısı nasıl uygulanır ASP.NET MVC 1.0'a MonoRail başvurusu yapıyorum. Orijinal uygulamamda özel bir önbellek sağlayıcısı (memcached kullanarak dağıtılmış bir önbellek sağlayıcısı) yazdım. Trende bu görev çerçevesi arayüzleri kullanıldığından çok kolaydı ve bu gibi görünüyor ICacheProvider vardır: Bu arayüzünASP.NET MVC

public interface ICacheProvider : IProvider, IMRServiceEnabled 
{ 
    void Delete(string key); 
    object Get(string key); 
    bool HasKey(string key); 
    void Store(string key, object data); 
} 

bir örneği her denetleyici eylem mevcuttur. Yani, tek yapmam gereken, memcached kullanan bir özel önbellek sağlayıcısını uygulamak ve önbellek sağlayıcımı kullanmak yerine MonoRail'i kullanmaktı. Kontrolörümü alay etmek ve test etmek çok kolaydı.

public abstract class HttpContextBase : IServiceProvider 
{ 
    ... 
    public virtual System.Web.Caching.Cache Cache { get; } 
    ... 
} 

Burada kullanılan Önbellek özelliği bir nasıl anlamıyorum: ASP.NET MVC 1.0'da

böyle HttpContextBase tanımlar System.Web.Abstractions montaj (isim umut verici görünüyor) var önbellek sağlayıcısının soyutlanması. Eski mühürlü Cache sınıfıdır. Görünüşe göre, çerçevedeki sınıflardan sadece bir tane struggling to mock değilim.

ASP.NET MVC çerçevesinde çok yeni ve burada bir şey eksik olmalıyım. Tanımladığım bir ICacheProvider arabirimini kullanan bir CustomBaseController ve tüm denetleyicilerimin bu temel sınıftan türemesini yazabilirim, ancak daha zarif (ASP.NET MVCish) bir çözüm varsa bunu uygulamaktan memnuniyet duyarım. HttpContextBase'in IServiceProvider uygulandığını fark ettim. GetService yöntemi hizmetleri nerede arayacak? Bu kolayca alay edilebilir mi?

cevap

18

Önbellek resmi bir soyutlama veya sağlayıcı yoktur, ancak kolayca bir oluşturabilirsiniz:

ASP.NET 4.0 içeren bir output cache provider abstraction (AFAIK değil genel önbellek soyutlaması ancak yalnızca çıkış için önbelleğe alma)

+3

@mausch, yaptığım işte tam olarak bu. İlk gönderiden net olmayan tek şey, bir IoC kullanarak HttpContext boru hattındaki önbellek soyutlamasının örneğin her yerden erişilebilir olması için nasıl enjekte edileceğidir. –

+4

HttpContext'te enjekte etmem. Bunun yerine, denetleyicilerinizde sadece soyutlama (ICache veya bunun adı ne olursa olsun) enjekte edin. –