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メソッドはどこでサービスを検索しますか?これは簡単に嘲笑できますか?