私は自分のプロジェクトに適したアーキテクチャを構築しようとしましたがNinject
、DI として使用Castle project
dinamic proxy
し、リポジトリにキャッシュを追加することにしました。残念ながら例外があります。これが私のコードです:
public class NinjectImplementation : NinjectModule
{
public override void Load()
{
// Binding repositories
var assembly = Assembly.GetAssembly(typeof(UserRepository));
var types = assembly.GetTypes()
.Where(t => t.Name.EndsWith("Repository") && !t.Name.StartsWith("I"));
ProxyGenerator generator = new ProxyGenerator();
//CacheInterceptor cacheInterceptor =
foreach (var type in types)
{
var interfaceType = type.GetInterfaces().Single();
var typeWithCaching = generator.CreateClassProxy(type, new MyTestShop.Infrastructure.Caching.CacheInterceptor());
Bind(interfaceType).To(typeWithCaching.GetType()).InThreadScope();
}
...//Service layer injection
}
}
そのため、リポジトリの実装ではなく、リポジトリのプロキシ クラス (キャッシングあり) を注入します。
これが私のIInterceptor
実装ですCastle dinamic proxy
:
[Serializable]
public class CacheInterceptor : IInterceptor
{
public void Intercept(IInvocation invocation)
{
int argumentCount = invocation.Arguments.Length;
if (argumentCount > 1)
{
invocation.Proceed();
return;
}
String methodNameInLower = invocation.Method.Name.ToLower();
if (methodNameInLower.StartsWith("get"))
{
String cachePath = invocation.TargetType.FullName + "_" + invocation.Method.Name + "_" + invocation.Arguments[0].ToString();
CacheHelper.Get(cachePath);
//DO SOMETHING
return;
}
}
}
_kernel.Get<T>()
メソッドで取得する例外Ninject DI container
:
- IInterceptor プロバイダーの条件付きの暗黙的な自己バインディングを使用して IInterceptor をアクティブ化する際にエラーが発生し、null が返されました。
アクティベーション パス: 3) UserRepositoryProxy 型のコンストラクターのパラメーターへの依存関係 IInterceptor の注入 2) UserService 型のコンストラクターのパラメーター userRepository への依存関係 IUserRepository の注入 1) IUserService の要求
提案: 1) プロバイダーが作成要求を適切に処理することを確認します。
説明: 現在の Web 要求の実行中に未処理の例外が発生しました。エラーの詳細とコード内のどこでエラーが発生したかについては、スタック トレースを確認してください。
例外の詳細: Ninject.ActivationException: IInterceptor プロバイダーの条件付きの暗黙的な自己バインディングを使用して IInterceptor をアクティブ化する際にエラーが発生し、null が返されました。アクティベーション パス: 3) UserRepositoryProxy 型のコンストラクターのパラメーターへの依存関係 IInterceptor の注入 2) UserService 型のコンストラクターのパラメーター userRepository への依存関係 IUserRepository の注入 1) IUserService の要求
提案: 1) プロバイダーが作成要求を適切に処理することを確認します。