2013-03-18 49 views
2

我試圖爲我的項目構建漂亮的體系結構,並決定使用Ninject作爲DI和Castle projectdinamic proxy爲我的存儲庫添加緩存。不幸的是我得到一個例外。這裏是我的代碼:城堡動態代理+ Ninject的問題與DI

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)依賴IInterceptor注射入型的構造的參數UserRepositoryProxy 2)依賴性IUserRepository注射到型UserService 1)請求IUserService

建議的構造的參數userRepository: 1 )確保提供者正確處理創建請求。

描述:執行當前Web請求期間發生未處理的異常。請查看堆棧跟蹤以獲取有關該錯誤的更多信息以及源代碼的位置。

異常詳細信息:Ninject.ActivationException:使用IInterceptor的條件隱式自綁定激活IInterceptor時出錯 提供程序返回null。 激活路徑:依賴IInterceptor的 3)注塑成型的構造的參數UserRepositoryProxy 2)依賴性IUserRepository注射入型UserService的構造 1)請求的參數userRepository爲IUserService

建議: 1)確保該提供程序正確處理創建請求。

+0

是否存在內部異常?也許有堆棧跟蹤? – PatrickSteele 2013-03-20 11:58:38

回答

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();