【发布时间】:2014-03-19 07:22:05
【问题描述】:
我有一个带有私有构造函数的 WCF 服务。如果我没记错的话,WCF中的构造函数必须是无参数的,而我需要的参数是调用者的名字(或者调用者的方法名),所以我可以分配几个只读字段。
有没有一种方法可以让我得到调用者的名字——或者调用它的方法?我正在玩 OperationContext.Current,但没有任何运气。
【问题讨论】:
我有一个带有私有构造函数的 WCF 服务。如果我没记错的话,WCF中的构造函数必须是无参数的,而我需要的参数是调用者的名字(或者调用者的方法名),所以我可以分配几个只读字段。
有没有一种方法可以让我得到调用者的名字——或者调用它的方法?我正在玩 OperationContext.Current,但没有任何运气。
【问题讨论】:
出于性能原因,我不建议访问堆栈跟踪。
如果您使用默认的ServiceHostFactory,WCF 服务构造函数只需要无参数。您可以像这样在 .svc 文件中指定自定义服务工厂:
<%@ ServiceHost Language="C#" Debug="true"
Service="Namespace.To.Service"
Factory="Namespace.To.ServiceFactory" %>
以自定义方式创建类的过程如下:
我已经使用它来将创建委托给 IoC 容器。
【讨论】:
您可以像这样访问 .NET 调用堆栈:
var trace = new System.Diagnostics.StackTrace();
var frame = trace.GetFrame( 1 ); // Frame 0 is current function
var callingMethodName = frame.GetMethod().Name;
我不知道这种技术是否适用于您的情况,但您可以尝试一下。
【讨论】:
我从未见过被调用方法根据调用者的身份执行不同操作的有效案例。如果调用者的身份很重要,那么调用者应该将它需要的任何信息传递给被调用的方法。而不是:
public MyClass(string callerName) {
if (callerName == "Caller1")
_field = "Value1";
else
_field = "Value2";
}
使用
public MyClass(string value) {
_field = value;
}
【讨论】:
我认为您最好的选择是将您的服务分解为多个类似的服务 (yuk),或者将您的方法分解为供不同调用者使用的重载。
即如果您有 Service1,它为 CallerA 和 CallerB 提供方法 foo(),则可以尝试将 foo 设为私有,并公开分别由 CallerA 和 CallerB 专门调用的 fooA() 和 fooB()。然后 fooA() 和 fooB() 可以在调用 foo() 之前适当地设置只读属性。
【讨论】: