Rafy 领域实体框架演示(3) - 快速使用 C/S 架构部署

本系列演示如何使用 Rafy 领域实体框架快速转换一个传统的三层应用程序,并展示转换完成后,Rafy 带来的新功能。
《福利到!Rafy(原OEA)领域实体框架 2.22.2067 发布!》
《Rafy 领域实体框架示例(1) - 转换传统三层应用程序》
以 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 架构部署的更多相关文章
- Rafy 领域实体框架演示(4) - 使用本地文件型数据库 SQLCE 绿色部署
本系列演示如何使用 Rafy 领域实体框架快速转换一个传统的三层应用程序,并展示转换完成后,Rafy 带来的新功能. <福利到!Rafy(原OEA)领域实体框架 2.22.2067 发布!> ...
- Rafy 领域实体框架演示(2) - 新功能展示
本文的演示需要先完成上一篇文章中的演示:<Rafy 领域实体框架示例(1) - 转换传统三层应用程序>.在完成改造传统的三层系统之后,本文将讲解使用 Rafy 实体框架后带来的一些常用功能 ...
- Rafy 领域实体框架示例(1) - 转换传统三层应用程序
Rafy 领域实体框架发布后,虽然有帮助文档,许多朋友还是反映学习起来比较复杂,希望能开发一个示例程序,展示如何使用 Rafy 领域实体框架所以,本文通过使用 Rafy 领域实体框架来改造一个传统的三 ...
- Rafy 领域实体框架简介
按照最新的功能,更新了最新版的<Rafy 领域实体框架的介绍>,内容如下: 本文包含以下章节: 简介 特点 优势 简介 Rafy 领域实体框架是一个轻量级 ORM 框架. 与一般的 ORM ...
- Rafy 领域实体框架 - 公司内部培训视频
本月给公司内部一个项目做架构重构,其中使用到了 Rafy 框架.所以我培训了 Rafy 领域实体框架的使用方法,过程中录制了视频,方便其他同事查看.现在把视频放到园里来分享下,有兴趣的朋友可以看看,有 ...
- Rafy 领域实体框架 - 树型实体功能(自关联表)
在 Rafy 领域实体框架中,对自关联的实体结构做了特殊的处理,下面对这一功能进行讲解. 场景 在开发数据库应用程序时,往往会遇到自关联表的场景.例如,分类信息.组织架构中的部门.文件夹信息等,都 ...
- Rafy 领域实体框架设计 - 重构 ORM 中的 Sql 生成
前言 Rafy 领域实体框架作为一个使用领域驱动设计作为指导思想的开发框架,必然要处理领域实体到数据库表之间的映射,即包含了 ORM 的功能.由于在 09 年最初设计时,ORM 部分的设计并不是最重要 ...
- Rafy 领域实体框架 - 领域模型设计器(建模工具)设计方案
去年4月,我们为 Rafy 框架添加了领域模型设计器组件.时隔一年,谨以本文,简要说明该领域模型设计器的设计思想. 设计目标 Rafy 实体框架中以领域驱动设计作为指导思想.所以在开发时,以领域建模为 ...
- 福利到!Rafy(原OEA)领域实体框架 2.22.2067 发布!
距离“上次框架完整发布”已经过去了一年半了,应群中的朋友要求,决定在国庆放假之际,把最新的框架发布出来,并把帮助文档整理出来,这样可以方便大家快速上手. 发布内容 注意,本次发布,只包含 Rafy ...
随机推荐
- Call for Papers IEEE/ACM International Conference on Advances in Social Network Analysis and Mining (ASONAM)
IEEE/ACM International Conference on Advances in Social Network Analysis and Mining (ASONAM) 2014 In ...
- Redis 数据类型及其特点
Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合). String(字符串) string是redis最 ...
- Nodejs初阶之express
PS: 2014/09/24 更新<Express 4.X 启航指南>,欢迎阅读和评论:) 老规矩,开头部分都是些自娱自乐的随想,想到哪写到哪... 到今天俺已经在俺厂工作俩年零几天了 ...
- 在SqlServer2008R2中,在一张表上加上insert、update、delete触发器(带游标)
在日常工作中,在SqlServer2008R2中,需要向一张表上加上触发器,监控插入.更新.删除. --一个触发器内三种INSERT,UPDATE,DELETE状态 IF exists(select ...
- C#设计模式-桥接模式
这里以电视遥控器的一个例子来引出桥接模式解决的问题,首先,我们每个牌子的电视机都有一个遥控器,此时我们能想到的一个设计是——把遥控器做为一个抽象类,抽象类中提供遥控器的所有实现,其他具体电视品牌的遥控 ...
- WPF入门教程系列十五——WPF中的数据绑定(一)
使用Windows Presentation Foundation (WPF) 可以很方便的设计出强大的用户界面,同时 WPF提供了数据绑定功能.WPF的数据绑定跟Winform与ASP.NET中的数 ...
- MongoDB 数组
MongoDB是文档型数据库,每个文档(doc)表示数据的一项记录.相比关系型DB的row只能使用简单的数据类型,doc能够使用复杂的数据类型:内嵌doc,数组.MongoDB的数组是一系列元素的集合 ...
- 【Win 10应用开发】多窗口视图
Windows App一般情况下,同一时刻只能有一个应用程序实例在运行,为了在特殊需求下可以同时呈现不同的UI,SDK提供了多视图操作支持. 应用程序可以创建新的应用视图,以新的视图为基础可以呈现与主 ...
- 万能Adapter以及ViewHolder性能优化
//CommonAdapter import android.content.Context; import android.widget.BaseAdapter; import java.util. ...
- Neutron 物理部署方案 - 每天5分钟玩转 OpenStack(68)
前面我们讨论了 Neutron 的架构,本节讨论 Neutron 的物理部署方案:不同节点部署不同的 Neutron 服务组件. 方案1:控制节点 + 计算节点 在这个部署方案中,OpenStack ...