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实现?的主要内容,如果未能解决你的问题,请参考以下文章