首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >as动态代理+ Ninject作为DI的问题

as动态代理+ Ninject作为DI的问题
EN

Stack Overflow用户
提问于 2013-03-18 08:35:15
回答 1查看 914关注 0票数 2

我试图为我的项目构建一个很好的架构,我决定使用Ninject作为DI和Castle project dinamic proxy来为我的存储库添加缓存。不幸的是我得到了一个例外。这是我的代码:

代码语言:javascript
复制
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实现

代码语言:javascript
复制
[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)在UserService 1型构造函数的参数userRepository中注入依赖IUserRepository

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

描述:在执行当前web请求时发生了未处理的异常。请查看堆栈跟踪以获得有关错误的更多信息,以及它起源于代码的位置。

异常详细信息: Ninject.ActivationException:使用IInterceptor提供程序的条件隐式自绑定激活IInterceptor的错误返回null。激活路径: 3)将依赖IInterceptor注入到UserRepositoryProxy类型构造函数的参数中;2)在UserService 1型构造函数的参数userRepository中注入依赖IUserRepository

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-03-26 08:50:01

我终于找到了我的问题的答案。问题是,我的代理不是类型,而是类型的实例,所以我按如下方式修正了它:

代码语言:javascript
复制
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();
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15472515

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档