首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >无法使Ninject.Extensions.Interception工作

无法使Ninject.Extensions.Interception工作
EN

Stack Overflow用户
提问于 2012-04-03 06:31:46
回答 2查看 6.7K关注 0票数 20

多年来我一直在努力想办法解决这个问题。当我试图用一个拦截器绑定我的类时,我得到了下面的异常

代码语言:javascript
运行
复制
Kernel.Bind<MyClass>().ToSelf().Intercept().With<ILoggerAspect>();

加载组件IAdviceFactory时出错。没有在内核的组件容器中注册这样的组件

我尝试过使用和不使用LoadExtensions,使用了一个模块来设置绑定,最后一次尝试如下所示

代码语言:javascript
运行
复制
internal class AppConfiguration 
{

    internal AppConfiguration( )
    {
        var settings = new NinjectSettings() { LoadExtensions = false };
        Kernel = new StandardKernel(settings);
        Load();
    }

    internal StandardKernel Kernel { get; set; }

    public static AppConfiguration Instance
    {
        get { return _instance ?? (_instance = new AppConfiguration()); }
    }

    private static AppConfiguration _instance;

    private void Load()
    {
        Kernel.Bind<ILoggerAspect>().To<Log4NetAspect>().InSingletonScope();
        Kernel.Bind<MyClass>().ToSelf().Intercept().With<ILoggerAspect>();
    }

    internal static StandardKernel Resolver()
    {
        return Instance.Kernel;
    }
}

我的Logger属性如下所示

代码语言:javascript
运行
复制
public class LogAttribute : InterceptAttribute
{
    public override IInterceptor CreateInterceptor(IProxyRequest request)
    {
        return request.Context.Kernel.Get<ILoggerAspect>();
    }
}

我的拦截器就像这样

代码语言:javascript
运行
复制
 public class Log4NetAspect : SimpleInterceptor, ILoggerAspect
{
    protected override void BeforeInvoke(IInvocation invocation)
    {
        Debug.WriteLine("Running " + invocation.ReturnValue);
        base.BeforeInvoke(invocation);
    }

    public new void Intercept(IInvocation invocation)
    {
        try
        {
            base.Intercept(invocation);
        }
        catch (Exception e)
        {
            Debug.WriteLine("Exception: " + e.Message);
        }
    }

    protected override void AfterInvoke(IInvocation invocation)
    {
        Debug.WriteLine("After Method");
        base.AfterInvoke(invocation);
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-04-03 07:02:14

很可能您没有将Ninject.Extensions.Interception.DynamicProxyNinject.Extensions.Interception.Linfu部署到应用程序和Ninject.Extensions.Interception旁边。你必须选其中之一。

使用现在就有的代码(LoadExtensions=false),它将无法获取特定的拦截库--您应该删除它,并且正常的扩展加载应该在创建时将扩展连接到内核中,以便截获位来获取它。

票数 30
EN

Stack Overflow用户

发布于 2016-06-27 16:48:29

除了Remo Gloor's answer (它指示我为Ninject.Extensions.Interception.DynamicProxy添加nuget包)之外,我一直得到与OP相同的异常,直到手动加载了一个DynamicProxyModule -- FuncModule也是手动加载的,以避免涉及工厂扩展的类似错误:

代码语言:javascript
运行
复制
_kernel = new StandardKernel(
    new NinjectSettings{LoadExtensions = true}, 
    new FuncModule(), 
    new DynamicProxyModule()); // <~ this is what fixed it
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9988204

复制
相关文章

相似问题

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