Unity拦截:如何将参数传递给ICallHandler实现?

Posted

技术标签:

【中文标题】Unity拦截:如何将参数传递给ICallHandler实现?【英文标题】:Unity Interception: How to pass parameter into ICallHandler implementation? 【发布时间】:2011-10-07 12:19:08 【问题描述】:

我可以像这样将 message 参数传递给 ICallHandler 实现吗:

var logic = container.Resolve<IBussinessLogic>(message);

并像这样使用它:

IMethodReturn ICallHandler.Invoke(IMethodInvocation input, GetNextHandlerDelegate getNext)
    
        Console.WriteLine(
            string.Format(
                "Begin 0 with param 1",
                input.MethodBase.Name, 
                message // parameter I need to be passed
            )
        );

        var result = getNext.Invoke()(input, getNext);

        Console.WriteLine("End " + input.MethodBase.Name);
        return result;
    

?

【问题讨论】:

【参考方案1】:

Steve Wilkes 似乎是对的:“老实说,这听起来不可能使用拦截。”

http://unity.codeplex.com/discussions/265679

【讨论】:

【参考方案2】:

您传递给Resolve 方法的message 实际上是Unity 要构造的命名实例名称。 Unity 使用该值来选择使用哪个实现 IBusinessLogic;在构建实现​​对象后它会丢失。

因此,该值仅在对象构建期间存在于 Unity 中;您的ICallHandler 无法以you cannot intercept constructors 的身份访问它。

【讨论】:

我知道这段代码不起作用。我写这个来描述我的想法。我所需要的 - 将参数从解析调用代码传递给 ICallHandler 实现。我还发现可以以某种方式将参数传递给 ICallHandler 实现构造函数。但是 ICallHandler 构造函数每个容器只调用一次(正如我测试的那样)。但是我每次调用 Resolve() 时都需要传递参数。 message 的本质是什么?你在设计时就知道了吗? 在我的例子中是 string。在我的实际应用程序中,它是 System.Web.Services.WebService。我的方面试图在调用真正的逻辑之前使用 WebService 的实例进行准备。 我明白了。老实说,这听起来不可能使用拦截。你可以用装饰器来代替吗? 如果您想更深入地讨论这个问题,请随时给我发电子邮件 :)

以上是关于Unity拦截:如何将参数传递给ICallHandler实现?的主要内容,如果未能解决你的问题,请参考以下文章

如何将参数传递给 Java 线程?

如何将参数传递给进程

如何通过反射将参数传递给方法

如何将参数传递给 erlang os:cmd()?

如何使用 SwiftUI 将参数传递给 Button 的操作

如何将两个参数传递给 Pool.starmap()?