2011-04-23 86 views
3

我正在为应用程序开发面向服务的体系结构,我希望通过WCF提供的服务既可以通过简单的库也可以使用。理想情况下,我想减少重复的代码。不使用WCF调用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()。Add(1,2)。这看起来像是一个很大的开销,因为我希望接口是相同的。
+0

是不是第二个资源泄漏,因为代理需要关闭? – alternative 2011-04-23 19:01:33

+0

这与问题并不完全相关 - 以上仅仅是示例代码在我的大脑中发出的咔嗒声。这个问题更概念化。 – Travis 2011-04-23 19:23:24

回答

2

您可以创建和localY使用WCF注解的类没有任何问题,除非你开始使用一些WCF相关的功能,如OperationContext

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

客户端= > ServiceAgent =>商务服务

客户端=> ServiceAgent => WCF服务=>商业服务

客户端本身并不知道服务本地是否都是远程的。服务代理是客户端组件,它基于其实现创建本地服务实例或调用远程WCF服务,从而创建业务服务实例。 ServiceAgent可以作为依赖注入到客户端,这将使您的应用程序具有很好的可配置性。你也可以在服务代理中暴露不同的接口(和业务服务实现一样),如果你想WCF服务和代理可以使用不同的接口。

如果您决定使用WCF服务,包括本地调用在内的所有时间都不使用NamedPipes。NamedPipes用于同一机器上的进程间通信。如果您想在同一过程中使用通信,请改用NullTransportLocal Channel。它仍然有更糟的表现,然后直接打电话。

+0

+1本地频道 - 我不知道。我想上面的CalculatorFactory可以被认为是ServiceAgent; CreateCalculator方法可能只是返回一个Calculator实例,或返回一个客户端通道。我的主要愿望是由客户执行者做出本地/远程决策。 – Travis 2011-04-25 03:51:20