我試圖爲我的項目構建漂亮的體系結構,並決定使用Ninject
作爲DI和Castle project
dinamic 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)確保該提供程序正確處理創建請求。
是否存在內部異常?也許有堆棧跟蹤? – PatrickSteele 2013-03-20 11:58:38