私は、私が遊んだり学んだりしている標準の.NETMVC3リポジトリパターンプロジェクトと考えるものを持っています。それはかなり標準的な構造です。
- リポジトリプロジェクト(下記のキャッシングインフラストラクチャを使用)
- ドメインモデルプロジェクト
- サービスレイヤープロジェクト
- MVCプレゼンテーションプロジェクト
静的コンストラクターのみを持つクラスのプライベートメンバーを注入する必要があるシナリオに遭遇しました。これにより、コンストラクターの注入ができなくなります。
問題のクラスは、完了したばかりのAppFabricキャッシング実装を使用するためのラッパーです。(そのような傾向がある人のために、私の実装はhttps://github.com/geersch/AppFabricに基づいてい ます)
基本的に私は持っています:
- インターフェイスICacheProvider
- クラスDefaultCacheProvider:ICacheProvider
- 静的クラスキャッシュ(私が注入した実装を利用する)
静的クラスキャッシュは、DefaultCacheProviderに解決されるICacheProviderを挿入したい場所です。
private static readonly ICacheProvider CacheProvider;
static Cache()
{
//DependencyResolver.Current.GetService<ICacheProvider>();
//CacheProvider =
// (ICacheProvider)ServiceLocator.Current
// .GetInstance(typeof(ICacheProvider));
}
public static void Add(string key, object value)
{
CacheProvider.Add(key, value);
}
public static void Add(string key, object value, TimeSpan timeout)
{
CacheProvider.Add(key, value, timeout);
}
public static object Get(string key)
{
return CacheProvider[key];
}
public static bool Remove(string key)
{
return CacheProvider.Remove(key);
}
私が読んだものに基づくと、これはServiceLocatorのシナリオのように見えますが、非常に強い意見(アンチパターンなど)がいくつか見られ、それと私の知識が低いため、確信が持てません。動作する実装。
キャッシュクラスを標準クラスとして設計し、SingletonScopeにICacheProviderを挿入するというStackOverflowの推奨事項を見てきました。
kernel.Bind<ICacheProvider>().To<DefaultCacheProvider>().InSingletonScope();
しかし、私は個人的に使いやすさのために静的ラッパーを好みます。
ServiceLocatorはここに行く方法を設定していますか、それとも私が気付いていない明らかな何かがありますか?ServiceLocatorが進むべき道である場合、Ninjectとの連携を利用することはできますか?Ninjectにサービスロケーター機能があることは知っていますが、実装方法がわかりませんでした。
情報をありがとう。