oo问题:对2个相似的对象应用相同的逻辑

时间:2009-06-08 17:16:56

标签: wcf design-patterns architecture oop polymorphism

我有2个要创建的对象,除了它们引用我的dev和测试WCF服务之外。基本上,这些是服务本身的对象,以及由WCF数据契约创建的DTO的对象。

在我的测试客户端中,我创建了与dev WCF服务相关的2个对象,或者与测试WCF服务相关的2个对象。然后我对两者应用相同的逻辑来测试我的服务合同等。

使用OO原则构建此结构的最佳方法是什么,最好不必编写两次逻辑?

供参考,以下是我正在创建的对象。第一组来自“ASRServiceClient”。第二组来自“ASRTestServiceClient”。

 ASRService.ASRServiceClient svc = new ASRService.ASRServiceClient();
 ASRService.ASRItem tr1 = new ASRService.ASRItem();

5 个答案:

答案 0 :(得分:4)

为什么需要根据您要连接的服务修改客户端中的代码?你能不能拥有2个不同的.config文件?一个包含dev服务的连接和一个包含测试服务连接的连接?只需根据测试/开发模式切换.config文件。

当然,您的服务合同将是一个接口,该服务的开发和测试版本都使用相同的合同接口,但这似乎不是您所要求的。

修改

如果您尚未提供服务,请为您的服务提取ServiceContract接口。您的开发和测试服务都应该实现该接口。像这样:

[ServiceContract(Namespace="http://stackoverflow.com/questions/965977")]
public interface IASRService
{
    [OperationContract]
    ASRItem GetASRItem();
}

您的客户端的app.config(或web.config)文件应该包含这样的内容,其中{namespace}是您的界面的命名空间位置。如果你想将它们保存在一个.config文件中,这将有效。

<system.serviceModel>
  <client>
    <endpoint name="ASRService" address="http://yourserver.com/ASRService" 
              contract="{namespace}.IASRService" binding="basicHttpBinding"/>
    <endpoint name="ASRServiceTest" address="http://localhost/ASRService" 
              contract="{namespace}.IASRService" binding="basicHttpBinding"/>
  </client>
</system.serviceModel>

使用这些服务的客户端代码如下所示。在ChannelFactory构造函数中指定配置的名称。

ChannelFactory<IASRService> cf = new ChannelFactory<IASRService>("ASRService");
IASRService proxy = cf.CreateChannel();

ASRItem DevServiceItem = proxy.GetASRItem;

OR

ChannelFactory<IASRService> cfTest = new ChannelFactory<IASRService>("ASRServiceTest");
IASRService proxyTest = cfTest.CreateChannel();

ASRItem TestServiceItem = proxyTest.GetASRItem;

由于任一代理的类型始终是IASRService,因此操作对象的代码只需要了解该类型。它不应该关心服务的哪个版本生成了对象。

另外,我会推荐Michele Leroux Bustamante撰写的这本书Learning WCF。关于如何做所有这些事情的很好的例子!

答案 1 :(得分:1)

使用界面。

答案 2 :(得分:0)

我会使用一个接口,并在配置文件中设置一个设置,在运行时确定要创建的具体类。

答案 3 :(得分:0)

或者可能是factory pattern

答案 4 :(得分:0)

您可以使用Template method,在子类中封装服务的环境特定数据。 但是,这可能不是一个模式的问题。最好具有特定于环境的配置文件。