WCF Service @ N-Tier App:在开发/生产之间切换?

时间:2013-01-09 19:51:19

标签: c# asp.net .net wcf

上下文

我们使用.NET Stack从端到端开发了应用程序。所以,假设我们正在管理这样的事情:

WPF客户端< =>网络服务:

  1. 开发)普通引用(直接调用VS内部的WCF服务项目,未部署在IIS中)
  2. 生产)远程Web服务[IIS @远程服务器,需要VPN连接]
  3. 网络服务< =>数据库:

    1. 开发)SQL Server Express本地数据库[@ development machine]
    2. Production)SQL Server DB [@ production server,与WS相同]
    3. 请注意,我已经实现了“手动方式,正确方式”(http://www.code-magazine.com/Article.aspx?quickid=0809101)。因此,单独的合同/客户代理等等......

      问题

      我怎样才能以优雅的方式获得如前所述的设置?我的意思是,网络服务< =>数据库它是微不足道的,因为我可以使用web.config转换来切换调试和放大之间的连接字符串。发布。但是,如何自动将“连接”从客户端应用程序切换到Web服务?

      在生产中,我使用对代理的引用,并描述app.config文件中的端点。我想在开发中我只需要对Web服务本身的简单引用。 [我应该在调试/发布配置之间添加/删除引用吗?如果是的话,如何以编程方式实现? ......我完全迷失了。

      谢谢你们的时间! ;)

      编辑:

      正如@AlexanderBalte所说,开发行为只是方法的直接调用。我在主开发机器上没有应用服务器。

2 个答案:

答案 0 :(得分:1)

就像评论prthrokz一样,我们只是切换端点。使用conditional compilation symbols尽可能简单(但不简单):

    WCFServiceClient client = new WCFServiceClient();
#if DEBUG
    client.Endpoint.Address = new EndpointAddress(new Uri("http://devSrv/WCFService.svc"));
    client.Endpoint.Name = "Dev";
#else
    client.Endpoint.Address = new EndpointAddress(new Uri("http://prodSrv/WCFService.svc"));
    client.Endpoint.Name = "Prod";
#endif

答案 1 :(得分:0)

据我了解, 开发行为只是方法的直接调用,生产行为是通过生成的代理与Web服务的交互。

分别在开发和制作中,您正在使用不同的类,但使用一组相似的方法。

也许我们应该创建另一个代理接口,其中包含一组精确的方法,如Web服务。 这个接口将有两个实现:一个是代理直接方法调用,另一个是web服务方法调用。

此外,您需要编写一个Factory类,它将根据app.config中的某些配置为您提供代理接口的实现。