【发布时间】:2015-07-13 12:04:07
【问题描述】:
我使用 WCF 服务,想知道是否可以为调用者和服务使用 OperationContract 方法。 因此,我想知道说明代码是在应用程序中运行还是在服务中运行的最佳方式。
像这样:
[ServiceContract]
public interface IService
{
[OperationContract]
bool ServiceMethod(string param);
}
[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Single,
InstanceContextMode = InstanceContextMode.Single, UseSynchronizationContext=false)]
public class Service : IService
{
bool ServiceMethod(string param)
{
if(!isInWcfService) //How to do this?
{
//Call this ServiceMethod in WCF Service
}
else
{
//Do the work
}
}
}
由于调用程序和服务都知道这个类,我认为如果两者都只需要调用这一个方法并且它自己决定是否必须将调用转发给服务或只是可以工作可能会更容易。
谢谢!
【问题讨论】:
-
我不确定你的提议是不是一个好主意。根据调用者是否是 WCF 服务,您是否需要不同的行为?如果是这样,我建议创建两种分离逻辑的方法。拥有一种可以产生不同副作用的方法通常是一个糟糕的设计选择。
-
好吧,一般来说该方法还是做一件事,只是如果调用者不是wcf服务,该方法首先调用该服务然后执行预期的工作。我背后的想法是,如果他只需要使用自说名称调用这个方法,而不必查找哪个适合他,哪个适合服务,那么该程序集将更容易为其他人使用。另一个想法是使这些类在两个友好程序集内部和可见,其中一个是服务,另一个是应用程序的程序集。你怎么看?
-
我同意@timothyclifford 的观点。但是您可以使用一些变通方法来识别您的方法的调用者。其中之一是添加自定义标头,因此如果来自 WCF 的任何客户端添加此标头,则可以轻松识别它。这个例子可以帮助你:stackoverflow.com/a/3277754
-
听起来不是一个好的软件设计方法。您可以在客户端继承该类并覆盖您的方法以首先添加所需的服务服务调用。
-
包含
if (something) { do one thing } else { do another }的方法是代码异味。它显然在做两件不同的事情,所以让它成为两种方法。如果这两种方法之间的区别只是一件事,那么就这样做,然后调用一个通用的第三种方法来完成其余的工作。