Castle动态代理+ Ninject为DI的问题

时间:2013-03-18 08:35:16

标签: c# .net dependency-injection ninject castle-dynamicproxy

我尝试为我的项目构建漂亮的架构,我决定使用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的{​​{1}}实现:

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; } } } 的{​​{1}}方法中获得的例外:

  
      
  • 使用条件隐式自绑定激活IInterceptor时出错   IInterceptor Provider的返回null。*
  •   
     

激活路径:    3)将依赖关系IIInceptor引入UserRepositoryProxy类型的构造函数的参数中    2)将依赖项IUserRepository注入到UserService类型的构造函数的参数userRepository中    1)请求IUserService

     

建议:    1)确保提供者正确处理创建请求。

     

描述:执行当前Web请求期间发生了未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。

     

异常详细信息:Ninject.ActivationException:使用IInterceptor的条件隐式自绑定激活IInterceptor时出错   Provider返回null。   激活路径:    3)将依赖关系IIInceptor引入UserRepositoryProxy类型的构造函数的参数中    2)将依赖项IUserRepository注入到UserService类型的构造函数的参数userRepository中    1)请求IUserService

     

建议:    1)确保提供者正确处理创建请求。

1 个答案:

答案 0 :(得分: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();