无法让 Ninject.Extensions.Interception 工作



我已经尝试了很长时间来理解这一点。当我试图将我的类与拦截器绑定时,行上出现以下异常

Kernel.Bind<MyClass>().ToSelf().Intercept().With<ILoggerAspect>();

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

我已经尝试过使用和不使用LoadExtensions,大约使用了使用模块来设置绑定,我的最后一次尝试看起来像这个

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;
    }
}

我的记录器属性看起来像这个

public class LogAttribute : InterceptAttribute
{
    public override IInterceptor CreateInterceptor(IProxyRequest request)
    {
        return request.Context.Kernel.Get<ILoggerAspect>();
    }
}

我的拦截弹像

 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);
    }
}

很可能您没有将Ninject.Extensions.Interception.DynamicProxyNinject.Extensions.Interception.Linfu与应用程序[和Ninject.Extensions.Interception]一起部署。你必须从中挑选一个。

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

除了Remo Gloor的回答使我倾向于为Ninject.Extensions.Interception.DynamicProxy添加nuget包外,我一直得到与OP相同的异常,直到我手动加载了DynamicProxyModule-FuncModule也手动加载,以解决涉及工厂扩展的类似错误:

_kernel = new StandardKernel(
    new NinjectSettings{LoadExtensions = true}, 
    new FuncModule(), 
    new DynamicProxyModule()); // <~ this is what fixed it

相关内容

  • 没有找到相关文章

最新更新