15

MonoRailアプリケーションをASP.NETMVC1.0に移行しています。元のアプリケーションでは、カスタムキャッシュプロバイダー(memcachedを使用する分散キャッシュプロバイダー)を作成しました。MonoRailでは、フレームワークがインターフェイスを使用し、次のようなICacheProviderがあるため、このタスクは非常に簡単でした。

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

このインターフェースのインスタンスは、すべてのコントローラーアクションで使用できます。したがって、私がしなければならなかったのは、memcachedを使用するカスタムキャッシュプロバイダーを実装し、MonoRailにデフォルトのキャッシュプロバイダーの代わりにキャッシュプロバイダーを使用するように指示することだけでした。また、コントローラーのモックと単体テストも非常に簡単でした。

ASP.NET MVC 1.0には、次のようにHttpContextBaseを定義するSystem.Web.Abstractionsアセンブリ(名前は有望に見えます)があります。

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

ここで使用されているCacheプロパティがキャッシュプロバイダーの抽象化である方法がわかりません。これは、レガシーの封印されたキャッシュクラスです。フレームワークのクラスをモックアウトするのに苦労しているのは私だけではないようです。

私はASP.NETMVCフレームワークに非常に慣れていないので、ここで何かが欠けているに違いありません。定義したICacheProviderインターフェイスを使用するCustomBaseControllerを記述でき、すべてのコントローラーはこの基本クラスから派生しますが、より洗練された(ASP.NET MVCish)ソリューションがあれば、それを実装できれば幸いです。HttpContextBaseがIServiceProviderを実装していることに気づきました。GetServiceメソッドはどこでサービスを検索しますか?これは簡単に嘲笑できますか?

4

2 に答える 2

18

Cache には公式の抽象化またはプロバイダーはありませんが、簡単に構築できます。

ASP.NET 4.0には、出力キャッシュプロバイダーの抽象化が含まれています(AFAIK一般的なキャッシュの抽象化ではなく、出力キャッシュ専用です)

于 2009-05-17T18:58:02.320 に答える
2

この答えは時代遅れです。ASP.NET 4.0:カスタム出力キャッシュプロバイダーの作成を参照してください。

于 2012-08-05T19:08:30.350 に答える