2013-03-18 48 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();