本系列演示如何使用 Rafy 领域实体框架快速转换一个传统的三层应用程序,并展示转换完成后,Rafy 带来的新功能。

福利到!Rafy(原OEA)领域实体框架 2.22.2067 发布!

Rafy 领域实体框架示例(1) - 转换传统三层应用程序

Rafy 领域实体框架演示(2) - 新功能展示

以 Rafy 开发的应用程序,其实体、仓库、服务代码不需要做任何修改,即可同时支持单机部署、C/S 分布式部署。本文将说明如果快速使用 C/S 分布式部署。

前言


截止到上一篇,我们开发的应用程序都是采用直接连接数据库的模式:

接下来,将通过一些简单的调整,使得这个应用程序支持以 C/S 架构部署。整个过程只需要少量的代码:

包含以下步骤:

  • 添加服务端控制台应用程序项目
  • 修改客户端应用程序连接方式
  • 配置客户端应用程序
  • 运行示例
  • 代码下载

添加服务端控制台应用程序项目


在整个解决方案中添加一个新的控制台应用程序,取名为 ServerConsole:

为项目添加所有 Rafy 程序集、CS 实体程序集以及 System.ServiceModel 程序集的引用:

在 Main 函数中添加以下代码,启动服务端领域项目,并开始监听 WCF 端口:

   1:  using System;
   2:  using System.Collections.Generic;
   3:  using System.Linq;
   4:  using System.ServiceModel;
   5:  using System.Text;
   6:  using CS;
   7:  using Rafy;
   8:  using Rafy.Domain;
   9:   
  10:  namespace ServerConsole
  11:  {
  12:      class Program
  13:      {
  14:          static void Main(string[] args)
  15:          {
  16:              PluginTable.DomainLibraries.AddPlugin<CSPlugin>();
  17:              new DomainApp().Startup();
  18:   
  19:              using (ServiceHost serviceHost = new ServiceHost(typeof(Rafy.DataPortal.WCF.ServerPortal)))
  20:              {
  21:                  serviceHost.Open();
  22:                  Console.WriteLine("Press <enter> to terminate service");
  23:                  Console.ReadLine();
  24:                  serviceHost.Close();
  25:              }
  26:          }
  27:      }
  28:  }


然后,为本项目添加应用程序配置文件 App.config,代码如下:

   1:  <?xml version="1.0" encoding="utf-8" ?>
   2:  <configuration>
   3:      <appSettings>
   4:          <add key="SQL_TRACE_FILE" value="D:\SQLTraceLog.txt"/>
   5:      </appSettings>
   6:      <connectionStrings>
   7:          <add name="CS" connectionString="server=.\SQLExpress;database=ClothesSys;uid=sa;pwd=GIX4" providerName="System.Data.SqlClient"/>
   8:      </connectionStrings>
   9:      <system.serviceModel>
  10:          <services>
  11:              <service name="Rafy.DataPortal.WCF.ServerPortal" behaviorConfiguration="includesException">
  12:                  <endpoint address="/Text" binding="basicHttpBinding" contract="Rafy.DataPortal.WCF.IWcfPortal"/>
  13:                  <host>
  14:                      <baseAddresses>
  15:                          <add baseAddress="http://localhost:8000/RafyServer" />
  16:                      </baseAddresses>
  17:                  </host>
  18:              </service>
  19:          </services>
  20:          <behaviors>
  21:              <serviceBehaviors>
  22:                  <behavior name="includesException">
  23:                      <serviceMetadata httpGetEnabled="true" />
  24:                      <serviceDebug includeExceptionDetailInFaults="true" />
  25:                  </behavior>
  26:              </serviceBehaviors>
  27:          </behaviors>
  28:      </system.serviceModel>
  29:  </configuration>

修改客户端应用程序连接方式


接下来需要把界面程序变更为连接服务端。打开 ClothesSys 项目中的 Program.cs 文件,修改为以下代码:

   1:  static class Program
   2:  {
   3:      /// <summary>
   4:      /// 应用程序的主入口点。
   5:      /// </summary>
   6:      [STAThread]
   7:      static void Main()
   8:      {
   9:          PluginTable.DomainLibraries.AddPlugin<CSPlugin>();
  10:          new ClientDomainApp().Startup();
  11:   
  12:          Application.EnableVisualStyles();
  13:          Application.SetCompatibleTextRenderingDefault(false);
  14:          Application.Run(new formLogin());
  15:      }
  16:  }
  17:   
  18:  /// <summary>
  19:  /// 客户端使用的应用程序类型。
  20:  /// </summary>
  21:  public class ClientDomainApp : DomainApp
  22:  {
  23:      protected override void InitEnvironment()
  24:      {
  25:          RafyEnvironment.Location.DataPortalMode = DataPortalMode.ThroughService;
  26:   
  27:          base.InitEnvironment();
  28:      }
  29:  }

RafyEnvironment.Location.DataPortalMode 表示连接数据的模式,默认值是DataPortalMode.ConnectDirectly(直接连接数据库),ClientDomainApp 类把该值变更为 DataPortalMode. ThroughService(通过服务连接数据)。

配置客户端应用程序


在客户端配置文件中,删除数据库连接配置,并添加 WCF 连接配置,如下:

   1:  <?xml version="1.0"?>
   2:  <configuration>
   3:      <configSections>
   4:          <section name="rafy" type="Rafy.Configuration.RafyConfigurationSection, Rafy" />
   5:      </configSections>
   6:      <rafy
   7:          dataPortalProxy="Rafy.DataPortal.WCF.ClientProxy, Rafy.Domain"
   8:          collectDevLanguages="IsDebugging">
   9:      </rafy>
  10:      <system.serviceModel>
  11:          <client>
  12:              <endpoint name="ClientProxyEndPoint" address="http://localhost:8000/RafyServer/Text"
  13:                        binding="basicHttpBinding" bindingConfiguration="basicHttpBindingConfig"
  14:                        contract="Rafy.DataPortal.WCF.IWcfPortal" />
  15:          </client>
  16:          <bindings>
  17:              <basicHttpBinding>
  18:                  <binding name="basicHttpBindingConfig" receiveTimeout="00:20:00" sendTimeout="02:00:00" maxReceivedMessageSize="1000000000">
  19:                      <readerQuotas maxDepth="64" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="4096" maxNameTableCharCount="16384"/>
  20:                  </binding>
  21:              </basicHttpBinding>
  22:          </bindings>
  23:      </system.serviceModel>
  24:  </configuration>

运行程序


先运行 ServerConsole,成功运行界面:

再运行 ClothesSys,点击登录。登录成功,即说明已经成功使用 C/S 进行部署。

代码下载


下载地址:http://pan.baidu.com/s/1AB9TL

本文的代码在“3.使用 CS 部署程序”文件夹中。

欢迎试用 Rafy 领域实体框架,框架发布地址:http://www.cnblogs.com/zgynhqf/p/3356692.html

Rafy 领域实体框架演示(3) - 快速使用 C/S 架构部署的更多相关文章

  1. Rafy 领域实体框架演示(4) - 使用本地文件型数据库 SQLCE 绿色部署

    本系列演示如何使用 Rafy 领域实体框架快速转换一个传统的三层应用程序,并展示转换完成后,Rafy 带来的新功能. <福利到!Rafy(原OEA)领域实体框架 2.22.2067 发布!> ...

  2. Rafy 领域实体框架演示(2) - 新功能展示

    本文的演示需要先完成上一篇文章中的演示:<Rafy 领域实体框架示例(1) - 转换传统三层应用程序>.在完成改造传统的三层系统之后,本文将讲解使用 Rafy 实体框架后带来的一些常用功能 ...

  3. Rafy 领域实体框架示例(1) - 转换传统三层应用程序

    Rafy 领域实体框架发布后,虽然有帮助文档,许多朋友还是反映学习起来比较复杂,希望能开发一个示例程序,展示如何使用 Rafy 领域实体框架所以,本文通过使用 Rafy 领域实体框架来改造一个传统的三 ...

  4. Rafy 领域实体框架简介

    按照最新的功能,更新了最新版的<Rafy 领域实体框架的介绍>,内容如下: 本文包含以下章节: 简介 特点 优势 简介 Rafy 领域实体框架是一个轻量级 ORM 框架. 与一般的 ORM ...

  5. Rafy 领域实体框架 - 公司内部培训视频

    本月给公司内部一个项目做架构重构,其中使用到了 Rafy 框架.所以我培训了 Rafy 领域实体框架的使用方法,过程中录制了视频,方便其他同事查看.现在把视频放到园里来分享下,有兴趣的朋友可以看看,有 ...

  6. Rafy 领域实体框架 - 树型实体功能(自关联表)

      在 Rafy 领域实体框架中,对自关联的实体结构做了特殊的处理,下面对这一功能进行讲解. 场景 在开发数据库应用程序时,往往会遇到自关联表的场景.例如,分类信息.组织架构中的部门.文件夹信息等,都 ...

  7. Rafy 领域实体框架设计 - 重构 ORM 中的 Sql 生成

    前言 Rafy 领域实体框架作为一个使用领域驱动设计作为指导思想的开发框架,必然要处理领域实体到数据库表之间的映射,即包含了 ORM 的功能.由于在 09 年最初设计时,ORM 部分的设计并不是最重要 ...

  8. Rafy 领域实体框架 - 领域模型设计器(建模工具)设计方案

    去年4月,我们为 Rafy 框架添加了领域模型设计器组件.时隔一年,谨以本文,简要说明该领域模型设计器的设计思想. 设计目标 Rafy 实体框架中以领域驱动设计作为指导思想.所以在开发时,以领域建模为 ...

  9. 福利到!Rafy(原OEA)领域实体框架 2.22.2067 发布!

    距离“上次框架完整发布”已经过去了一年半了,应群中的朋友要求,决定在国庆放假之际,把最新的框架发布出来,并把帮助文档整理出来,这样可以方便大家快速上手.   发布内容 注意,本次发布,只包含 Rafy ...

随机推荐

  1. datatables服务器端分页要点

    背景:当要查询大量数据的时候,有datatables自身的分页,明显查询比较慢,这是要使用服务器端分页 参数:"bServerSide": true, "fnServer ...

  2. HTML以及CSS的作用和理念

    首先,在学习之前,这些是必要知道的东西.什么是HTML,什么是CSS 它们有什么用?又能做什么? 了解HTML和CSS的用途,能更有利我们快速,高效的学习它们. 那么,关于这两者,我就用我通俗的语言像 ...

  3. mac远程桌面连接windows 8.1 update,提示: 远程桌面连接无法验证您希望连接的计算机的身份

    在网上找到解决方案: SolutionEnable RDP security layer in Group Policy on the machine: Verify that the firewal ...

  4. 深圳电信光纤用户必备:简单破解中兴ZXA10 F460光电猫,实现WIFI和自动拨号功能

    最近搬家,ADSL转成光纤宽带,下载速度非常给力.原来的ADSL路由器派不上用场,电信的安装人员也给开通了wifi功能,只是wifi无法上网,而且拨号一定需要用电脑连网线进行拨号.以前是直接把拨号账户 ...

  5. 简单的jQuery幻灯片实现

    一.一些抱怨 自从国庆放假上班以来,又是忙碌的工作直到现在,但是说忙好像也没有加几天班,只是上班的时候工作排的挺满.但是别人貌似一直都不太忙(也是我自己觉得),感觉就很不爽. 我喜欢快速做完一件事,然 ...

  6. ENode框架Conference案例分析系列之 - 业务简介

    前言 ENode是一个应用开发框架.通过ENode,我们可以方便的开发基于DDD+CQRS+EventSourcing+EDA架构的应用程序.之前我已经写了很多关于ENode的架构以及设计原理的文章, ...

  7. 可以这样去理解group by和聚合函数

    写在前面的话:用了好久group by,今天早上一觉醒来,突然感觉group by好陌生,总有个筋别不过来,为什么不能够select * from Table group by id,为什么一定不能是 ...

  8. Objective-C 外观模式--简单介绍和使用

    外观模式(Facade),为子系统中的一组接口提供一个一致的界面,定义一个高层接口,这个接口使得这一子系统更加容易使用. 在以下情况下可以考虑使用外观模式: (1)设计初期阶段,应该有意识的将不同层分 ...

  9. PHP面向对象笔记

    一.构造函数.析构函数(1)构造函数:__construct()说明:对象被实例化时调用,可带参数例: $obj = new A($a,$b); (2)析构函数:_destruct()说明:页面执行结 ...

  10. PHP中的list()说明

    list() 用于在一次操作中给一组变量赋值. 注释:list()只用于数字索引的数组,且假定数字索引从 0 开始. 说明 list() 用数组中的元素为一组变量赋值. 注意,与 array() 类似 ...