我试图为我的项目构建漂亮的体系结构,并决定使用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