我试图为我的项目构建好的体系结构,所以决定使用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
    }
}


因此,我注入的不是存储库的实现,而是注入存储库的代理类(带有缓存)。

这是我IInterceptorCastle 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 Provider的返回null。*
  
  
  激活路径:
   3)将依赖项IInterceptor注入到UserRepositoryProxy类型的构造函数的参数中
   2)将依赖项IUserRepository注入到UserService类型的构造函数的参数userRepository中
   1)请求IUserService
  
  意见建议:
   1)确保提供者正确处理创建请求。
  
  说明:执行当前Web请求期间发生未处理的异常。请查看堆栈跟踪,以获取有关错误及其在代码中起源的更多信息。
  
  异常详细信息:Ninject.ActivationException:使用IInterceptor的条件隐式自绑定激活IInterceptor时出错
  提供者返回null。
  激活路径:
   3)将依赖项IInterceptor注入到UserRepositoryProxy类型的构造函数的参数中
   2)将依赖项IUserRepository注入到UserService类型的构造函数的参数userRepository中
   1)请求IUserService
  
  意见建议:
   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();

关于c# - CaSTLe动态代理+ Ninject作为DI的问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15472515/

10-10 07:19