我正在为应用程序开发面向服务的体系结构,我希望这些服务既可以通过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)是不好的做法?
补充意见:
答案 0 :(得分:2)
除非您开始使用某些与WCF相关的功能,例如OperationContext
等,否则您可以毫无问题地创建和使用WCF带注释的类。
一般来说,这是以不同方式抽象的:
客户端=&gt; ServiceAgent =&gt;商业服务
或
客户端=&gt; ServiceAgent =&gt; WCF服务=&gt;商业服务
客户端本身不知道该服务是否是本地所有远程服务。服务代理是客户端组件,它基于其实现创建本地服务实例或调用远程WCF服务,后者又创建业务服务实例。 ServiceAgent可以作为依赖注入客户端,这将使您的应用程序非常好地配置。您还可以在服务代理上公开不同的接口(与业务服务实现相同),如果您希望WCF服务和代理可以使用不同的接口。
如果您决定始终使用WCF服务(包括本地调用),请不要使用NamedPipes。 NamedPipes用于同一机器上的进程间通信。如果您想在同一过程中使用通信,请改用NullTransport或Local Channel。它的性能仍然比直接呼叫差。