我有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();
答案 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,在子类中封装服务的环境特定数据。 但是,这可能不是一个模式的问题。最好具有特定于环境的配置文件。