2

私は自分のプロジェクトに適したアーキテクチャを構築しようとしましたが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) プロバイダーが作成要求を適切に処理することを確認します。

4

1 に答える 1

1

私はついに私の質問に対する答えを見つけました。問題は、私のプロキシがタイプではなく、タイプのインスタンスであるため、次のように修正したことです。

var interfaceType = type.GetInterfaces().Single();

var proxy = generator.CreateClassProxy(type,
    new Type[] { interfaceType },
    new IInterceptor[]
    {
        new CacheInterceptor(), 
        new LoggingInterceptor()
    });

// I'm using directive ToConstant(..), and not To(..)
Bind(interfaceType).ToConstant(proxy).InThreadScope();
于 2013-03-26T08:50:01.930 に答える