加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – Ninject使用params进行方法级拦截

发布时间:2020-12-15 08:00:34 所属栏目:百科 来源:网络整理
导读:我已经注意到在截取教程中你可以定位一个方法并拦截它.即 Kernel.BindFoo().ToSelf(); Kernel.InterceptReplaceFoo(foo = foo.ThrowsAnError(),invocation = {} ); 文档/教程未涵盖在您尝试拦截的方法具有参数的情况下要执行的操作,即ThrowsAnError接受字符
我已经注意到在截取教程中你可以定位一个方法并拦截它.即
Kernel.Bind<Foo>().ToSelf();
 Kernel.InterceptReplace<Foo>(foo => foo.ThrowsAnError(),invocation => {} );

文档/教程未涵盖在您尝试拦截的方法具有参数的情况下要执行的操作,即ThrowsAnError接受字符串作为参数.

Kernel.Bind<Foo>().ToSelf();
 Kernel.InterceptReplace<Foo>(foo => foo.ThrowsAnError(**param goes here**),invocation => {} );

在绑定时我无法访问params,所以我想知道我是否会以错误的方式进行此操作?

编辑

Working example

解决方法

我想你误解了会发生什么.您的Foo对象将替换为包含拦截器的装饰器.这是一个简单的例子:
public class FooDecorator : Foo
{
    private readonly Foo decorated;

    public FooDecorator(Foo foo) { this.decorated = foo; }

    public void ThrowsAnError(object param1,int param2)
    {
        // calls the decorated instance with supplied parameters
        this.decorated.ThrowsAnError(param1,param2);
    }
}

换句话说,调用已解析的Foo时提供的参数将传递给修饰的实例.

然而,通过拦截,这更加间接(和更慢),但概念是相同的.我必须承认我不熟悉Ninject拦截,但调用对象上可能有一个Proceed方法.换句话说,你应该做这样的事情:

Kernel.InterceptReplace<Foo>(foo => foo.ThrowsAnError(),invocation =>
    {
        try
        {
            // calls the decorated instance with supplied parameters
            invocation.Proceed();
        }
        catch (Exception ex)
        {
            Kernel.Get<ILogger>().Log(ex);
        }
    } );

UPDATE

我假设InterceptReplace< T>的第一个参数. method不是委托,而是表达式树,例如Expression< Action< T>>.事实上这个方法没有被调用,但是它被分析以找出拦截哪种方法.换句话说,由于永远不会调用该方法,因此您可以提供任何参数.诀窍是让C#编译器知道要使用哪个方法重载(如果有的话).如果你提供垃圾并不重要.当两个参数都是引用类型时,这可能会起作用:

Kernel.InterceptReplace<Foo>(foo => foo.ThrowsAnError(null,null),

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读