在不使用WCF的情况下调用WCF服务 - 好的还是坏的做法?

时间:2011-04-23 18:56:28

标签: wcf shared-libraries soa n-tier-architecture

我正在为应用程序开发面向服务的体系结构,我希望这些服务既可以通过WCF公开,也可以通过简单的库使用。理想情况下,我希望减少重复的代码。

从概念上讲,这映射到:

客户端=> WCF服务=>服务库(实际实施)

客户端=>服务库(实际实施)

基于客户所在的位置(本地或远程)。

这是一个简单的例子:

[ServiceContract]
public interface ICalculator
{
    [OperationContract]
    int Add(int a, int b);
}

public class Calculator : ICalculator
{
    public int Add(int a, int b)
    {
        return a + b;
    }
}

public class CalculatorFactory
{
    public static ICalculator CreateCalculator()
    {
        return new Calculator();
    }
}

我的客户端应用程序执行了以下操作

int result = CalculatorFactory.CreateCalculator().Add(1,2);

int result = IChannelFactory<ICalculator>().CreateChannel().Add(1,2);

取决于它是本地还是远程。

直接调用WCF注释代码(即不使用WCF)是不好的做法?

补充意见:

  • 我意识到我可以在所有情况下使用WCF,只使用NamedPipes为本地连接托管服务。如果我可以为了简单起见,我想避免这种情况。
  • 上述方法的替代方法是基本复制服务库中的ICalculator接口,并将WCF服务实现更改为包含CalculatorFactory.CreateCalculator()。添加(1,2)。考虑到我希望界面是相同的,这似乎是很多开销。

1 个答案:

答案 0 :(得分:2)

除非您开始使用某些与WCF相关的功能,例如OperationContext等,否则您可以毫无问题地创建和使用WCF带注释的类。

一般来说,这是以不同方式抽象的:

客户端=&gt; ServiceAgent =&gt;商业服务

客户端=&gt; ServiceAgent =&gt; WCF服务=&gt;商业服务

客户端本身不知道该服务是否是本地所有远程服务。服务代理是客户端组件,它基于其实现创建本地服务实例或调用远程WCF服务,后者又创建业务服务实例。 ServiceAgent可以作为依赖注入客户端,这将使您的应用程序非常好地配置。您还可以在服务代理上公开不同的接口(与业务服务实现相同),如果您希望WCF服务和代理可以使用不同的接口。

如果您决定始终使用WCF服务(包括本地调用),请不要使用NamedPipes。 NamedPipes用于同一机器上的进程间通信。如果您想在同一过程中使用通信,请改用NullTransportLocal Channel。它的性能仍然比直接呼叫差。