系 统 架 构 师 - 基 础 到 企 业 应 用 架 构 - 服 务 层 -----------------------------By CallHot 一 上 章 回 顾 上 篇 我 们 主 要 讲 解 了 系 统 架 构 中 的 四 种 架 构 模 式, 并 且 分 析 了 四 种 架 构 模 式 的 实 现 及 应 用 场 景, 那 么 先 来 回 顾 下 架 构 中 的 业 务 逻 辑 层 的 使 用 及 总 结 如 果 大 家 对 图 中 讲 述 的 内 容 不 明 白 或 者 说 是 不 深 入 那 么 可 以 参 考 上 篇 讲 解 的 内 容 : 系 统 架 构 师 - 基 础 到 企 业 应 用 架 构 - 业 务 逻 辑 层 二 摘 要 本 文 将 已 架 构 的 方 式 去 分 析 分 层 结 构 中 的 服 务 层 的 设 计, 如 何 设 计 出 来 满 足 我 们 说 的 业 务 需 求 及 设 计 规 范 的 服 务 层 将 是 我 们 的 目 标, 可 能 我 想 大 家 在 项 目 架 构 的
过 程 中 可 能 有 些 同 仁, 没 有 用 到 该 层, 或 者 说 是 采 用 的 是 常 用 的 分 层 结 构 的 设 计, 而 没 有 把 服 务 层 单 独 的 抽 出 来, 当 然 我 们 必 须 首 先 知 道 服 务 层 是 干 什 么 用 的? 为 什 么 要 单 独 写 一 个 服 务 层 呢? 还 有 就 是 设 计 服 务 层 我 们 从 哪 些 方 面 入 手 呢? 及 怎 么 判 定 一 个 服 务 层 设 计 的 好 坏 呢? 这 些 都 是 本 章 要 讲 解 的 具 体 内 容, 当 然 本 文 中 的 内 容 都 是 本 人 平 时 在 项 目 中 的 一 些 经 验, 可 能 在 一 些 有 丰 富 经 验 设 计 的 大 牛 面 前, 我 讲 解 的 都 是 皮 毛, 但 是 我 抱 着 能 给 初 学 者 指 引 和 为 已 知 者 温 习 的 目 的 而 写, 错 误 之 处 再 所 难 免, 请 大 家 提 出 宝 贵 意 见 和 建 议 本 文 讲 述 以 下 内 容 : 别 进 行 讲 述 下 面 我 们 将 针 对 上 面 的 问 题 分 三 本 章 大 纲 1 上 章 回 顾 2 摘 要 3 本 章 大 纲 4 服 务 层 的 介 绍 5 服 务 层 实 战 6 本 章 总 结 7 系 列 进 度 8 下 篇 预 告 四 服 务 层 的 介 绍
本 节 中 将 会 对 服 务 层 的 设 计 进 行 详 细 的 分 析 我 们 知 道 我 们 现 在 在 软 件 开 发 的 过 程 中, 通 常 我 们 会 将 一 些 业 务 逻 辑 的 代 码 写 在 表 现 层, 当 然 这 样 的 方 式 不 是 不 允 许, 当 然 一 般 情 况 下 来 说 我 们 感 觉 没 什 么, 但 是 采 用 这 样 的 方 式, 那 么 表 现 层 与 业 务 逻 辑 层 之 间 的 关 系 是 耦 合 性 的, 可 能 我 们 是 属 于 那 种 希 望 设 计 简 洁 或 者 说 对 设 计 规 范 严 格 要 求 的 时 候, 那 么 我 们 就 可 以 考 虑 将 业 务 逻 辑 的 组 织 通 过 服 务 层 来 实 现, 那 么 服 务 层 的 作 用 就 是 将 表 现 层 与 业 务 逻 辑 层 之 间 完 成 解 耦 那 么 表 现 层 中 就 不 会 出 现 任 何 的 业 务 代 码, 当 然 这 样 带 来 的 好 处 也 是 显 而 易 见 的, 就 是 当 我 们 修 改 业 务 层 代 码 时, 我 们 不 需 要 修 改 表 现 层 的 代 码, 当 然 如 果 服 务 层 设 计 的 不 好, 那 么 可 能 会 造 成 反 效 果 服 务 层 是 干 什 么 的? 通 过 上 面 的 简 单 介 绍, 我 想 大 家 都 对 服 务 层 有 了 个 简 单 的 认 识, 那 么 下 面 我 们 还 是 通 过 图 形 的 方 式 来 看 看 服 务 层 的 位 置 及 作 用 吧, 可 能 那 样 更 容 易 理 解 这 几 层 之 间 都 是 通 过 数 据 传 输 对 象 来 完 成 各 层 之 间 的 数 据 通 信 通 过 上 图 我 们 知 道, 服 务 层 是 通 过 数 据 传 输 对 象 与 业 务 逻 辑 层 直 接 进 行 交 互, 那 么 业 务 逻 辑 层 与 服 务 层 具 体 交 互 的 方 式 及 内 容 是 什 么 呢? 下 面 我 们 来 看 看, 业 务 逻 辑 层 中 的 四 种 模 式 在 服 务 层 中 的 表 现
下 面 我 们 来 举 例 说 明 服 务 层 的 作 用 通 过 表 现 层 与 业 务 逻 辑 的 解 耦 来 说 明 服 务 层 的 作 用 我 们 还 是 以 B2C 中 的 购 物 流 程 来 说 我 们 先 以 购 物 流 程 中 的 添 加 产 品 到 购 物 车 来 说 可 以 简 单 的 看 作 下 面 几 个 对 象 之 间 的 交 互, 首 先 我 们 先 要 选 择 产 品, 然 后 将 产 品 添 加 到 购 物 车 中, 然 后 当 然 这 个 购 物 车 是 某 个 会 员 登 陆 以 后 的 购 物 清 单, 一 个 购 物 车 中 可 能 有 多 个 产 品 我 们 来 看 看 代 码 可 能 如 下 : 我 们 定 义 的 产 品 信 息 如 下 :
/// 产 品 信 息 public class Product /// 返 回 所 有 的 产 品 信 息 /// <returns></returns> public List<Product> GetAll() return new List<Product>(); /// 返 回 产 品 信 息 根 据 产 品 ID /// <returns></returns> public Product GetByID(int ID) return new Product(); 产 品 信 息 中 包 含 2 个 方 法, 一 个 是 获 取 所 有 产 品 的 列 表, 还 有 一 个 是 获 取 实 体 的 信 息 根 据 主 键 我 们 来 看 看 购 物 车 的 代 码 : /// 购 物 车
public class ShopCar /// 购 物 车 中 的 产 品 Dictionary<int, Product> products = new Dictionary<int, Product>(); /// 将 指 定 产 品 ID 的 产 品 添 加 到 购 物 车 public bool Add(int ID) Product product = new Product(); product= product.getbyid(id); if (products.containskey(id)) return false; products.add(id,product); return true; 下 面 我 们 来 看 看 前 台 调 用 的 代 码 : public class ShopCar /// 将 指 定 产 品 ID 的 产 品 添 加 到 购 物 车 public bool Add(int ID)
ShopCar cart = new ShopCar(); return cart.add(id); 上 面 的 代 码 引 用 了 ShopCar 对 象, 说 明 UI 层 的 ShopCar 与 业 务 层 的 ShopCar 有 依 赖 关 系, 那 么 我 们 如 何 解 耦 呢? 通 过 引 入 第 三 方 类, 来 实 现 依 赖 的 解 除 具 体 的 代 码 如 下 : public class ShopCar /// 将 指 定 产 品 ID 的 产 品 添 加 到 购 物 车 public bool Add(int ID) IShopCar car; CarFactory factory = new CarFactory(); car = factory.shopcarfactory(); car.add(id); return true; 修 改 后 通 过 服 务 层 中 的 购 物 车 工 厂 构 造 出 购 物 车 实 例, 这 样 就 可 以 把 业 务 逻 辑 层 与 界 面 层 之 间 的 耦 合 关 系 通 过 新 增 加 一 个 服 务 层 来 实 现 解 耦, 那 么 表 现 层 的 代 码 更 简 介, 也 符 合 设 计 规 范 其 实 我 们 这 里 的 服 务 只 是 讲 述 了 服 务 层 的 简 单 应 用 场 景, 其 实 具 体 的 服 务 层 在 使 用 的 过 程 中 远 比 我 们 前 面 讲 解 的 复 杂, 首 先 可 能 服 务 层 还 会 与 数 据 访 问 层 直 接 交 互, 比 如 说 操 作 数 据 库, 持 久 化 等, 服 务 层 主 要 是 组 织 业 务 逻 辑 中 的 业 务 逻 辑 组 件, 服 务 层 还 通 过 ORM 框 架 中 提 供 的 数 据 库 访 问 服 务 完 成 相 应 的 操 作 我 们 前 面 讲 过,
一 般 情 况 下, 表 现 层 与 服 务 层 交 互 是, 都 是 通 过 数 据 传 输 对 象 来 进 行 通 信 的, 那 么 显 然 有 时 候 我 们 需 要 在 服 务 层 做 处 理, 将 数 据 传 输 对 象 转 换 成 领 域 模 型, 当 然 有 时 候 我 们 在 设 计 系 统 架 构 时, 如 果 系 统 中 的 领 域 模 型 较 多, 或 者 说 是 拆 分 后 的 数 据 传 输 对 象 太 多 时, 我 们 只 要 将 一 个 领 域 模 型 对 应 一 个 数 据 传 输 对 象 就 好, 只 不 过 是 把 领 域 模 型 中 的 行 为 省 略 而 已 我 们 来 看 看 目 前 比 较 流 行 的 关 于 服 务 层 的 认 识 : 我 想 目 前 最 流 行 的 关 于 服 务 层 的 架 构 就 是 SOA( 面 向 服 务 架 构 ), 可 以 说 是 SOA 的 出 现 才 让 服 务 层 流 行 起 来,SOA 中 对 服 务 的 理 解 是 这 样 的, 服 务 层 是 提 供 一 系 列 的 服 务, 而 具 体 的 业 务 流 程 是 通 过 一 系 列 的 服 务 组 成 的, 把 服 务 看 作 不 是 面 向 某 种 特 定 的 技 术, 而 是 业 务 流 程 的 组 织 方 式 达 到 的 目 的 是, 提 供 了 一 系 列 的 服 务, 只 需 要 配 置 组 织 服 务 的 流 程, 就 可 以 不 管 什 么 样 的 技 术, 都 能 满 足 要 求 的 业 务 流 程 当 然 这 是 理 想 化 的 形 式, 具 体 的 实 行 起 来 还 是 有 相 当 大 的 难 度 其 实 我 们 可 以 这 样 想 象, 服 务 就 是 一 个 提 供 了 API 的 类, 通 过 封 装, 外 界 访 问 服 务 时 只 能 通 过 服 务 提 供 的 接 口 来 访 问 例 如 我 们 通 过 服 务 层 提 供 上 述 的 四 种 服 务, 然 后 在 表 现 层 中 通 过 服 务 层 中 的 服 务 的 调 用 来 完 成 相 应 的 功 能, 比 如 我 们 在 表 现 层 中 有 新 纪 录 添 加 时, 我 们 通 过 服 务 层 的 添 加 记 录 的 方 法 来 完 成, 服 务 层 通 过 提 供 的 服 务 直 接 完 成 相 应 的 准 备 工 作, 并 且 这 些 服 务 在 定 义 时 都 是 通 过 接 口 的 方 式 来 向 外 提 供 功 能, 因 此 只 要 满 足 接 口 契 约 就 可 以 完 成 组 件 的 替 换 工 作, 而 不 会 影 响 系 统 的 运 行
我 们 有 的 时 候 有 这 样 的 需 求, 我 们 的 软 件 程 序 要 求 既 有 B/S 的 形 式 直 接 通 过 浏 览 器 来 完 成 应 用, 有 时 候 还 需 要 C/S 客 户 端 的 形 式 访 问 系 统 的 功 能, 这 时 候 我 们 如 果 通 过 服 务 来 组 织 业 务 逻 辑 那 么 我 们 只 需 要 写 一 个 服 务 层 就 可 以 完 成 远 程 服 务 访 问, 而 不 用 B/S 下 写 一 次 业 务 逻 辑 调 用, 然 后 C/S 下 再 写 一 次, 而 且 这 样 一 旦 修 改 了 相 应 的 业 务 逻 辑, 那 么 我 们 需 要 变 动 的 代 价 很 大 我 们 来 看 看 服 务 层 给 我 们 提 供 了 什 么 通 过 服 务 层 我 们 可 以 不 关 心 业 务 逻 辑 的 实 现, 我 们 在 用 户 图 形 化 界 面 中 只 需 要 访 问 相 关 的 服 务 即 可, 举 个 简 单 例 子, 就 行 银 行 的 银 联, 跨 行 取 款 的 行 为 下 面 可 以 简 单 的 描 述 了 用 户 取 款 的 服 务
上 面 简 单 的 描 述 了, 用 户 的 取 款 服 务, 当 然 只 要 是 银 联 的 银 行 卡, 都 可 以 享 受 到 跨 行 的 异 地 取 款, 当 然 不 管 什 么 卡, 提 供 给 用 户 的 服 务 都 是 相 同 的 当 然 我 们 这 里 说 的 是 C/S 客 户 端 服 务 这 样 的 要 求, 当 然 如 果 说 是 B/S 架 构 的 形 式, 那 么 可 能 我 们 不 用 单 独 抽 出 这 样 的 远 程 服 务 的 形 式 而 服 务 层 可 能 就 是 表 现 层 的 一 部 分, 这 时 候 我 们 建 议 不 要 把 服 务 层 设 计 成 web 服 务, 这 时 候 我 们 设 计 服 务 层 时 更 关 心 服 务 层 的 抽 象, 而 不 是 实 现 方 式 一 般 情 况 下 来 说 服 务 层 的 设 计 实 现, 可 能 有 时 候 和 部 署 时 的 要 求 有 关, 例 如 有 时 候 我 们 需 要 将 服 务 部 署 在 应 用 服 务 器 上, 这 时 候 我 们 就 必 须 考 虑 服 务 层 必 须 发 布 成 远 程 调 用 服 务 或 者 Web 服 务, 当 然 具 体 的 远 程 调 用 服 务 可 以 有 几 种 方 式, 我 们 主 要 看 基 于 什 么 通 信 方 式, 是 remoting 还 是 soap, 还 是 socket 通 信 等 当 然 有 时 候 我 们 对 服 务 分 为 二 种 类 型, 粗 粒 度 的 服 务 与 细 粒 度 的 服 务, 那 么 我 们 怎 么 理 解 它 呢? 其 实 说 白 了 粗 粒 度 的 服 务 就 是 某 个 大 的 服 务, 而 细 粒 度 的 就 是 大 的 服 务 内 部 的 子 服 务 可 以 这 样 理 解, 粗 粒 度 是 按 照 用 例 来 组 织 操 作 的, 例 如 我 们 上 面 的 银 行 取 款 服 务, 那 么 粗 粒 度 的 服 务 就 看 作 这 样 的 流 程, 用 户 插 卡 - 输 入 密 码 - 取 款 - 退 卡 而 细 粒 度 的 服 务 关 系 的 是 : 检 查 用 户 账 户, 余 额 的 转 换 等, 包 括 一 些 比 较 详 细 的, 密 码 的 验 证 等 等, 这 些 都 是 细 粒 度 的 服 务, 可 以 把 粗 粒 度 看 作 某 个 用 例 的 大
的 业 务 操 作, 对 领 域 中 的 对 象 不 关 心, 只 关 心 领 域 模 型 中 的 交 互 细 粒 度 可 以 看 作 领 域 模 型 中 的 具 体 对 象 及 对 象 的 行 为 接 下 来 我 们 将 讲 述 服 务 层 常 用 的 几 种 架 构 模 式 : 第 五 节 中 将 会 详 细 的 讲 述 每 种 模 式 及 模 式 直 接 的 区 别 及 应 用 我 们 来 看 看 服 务 层 的 应 用 场 景 及 什 么 情 况 下 使 用 服 务 层? 一 般 来 说 服 务 层 适 合 企 业 应 用 系 统 中, 也 适 合 多 层 系 统 中, 特 别 是 业 务 逻 辑 比 较 复 杂 的 系 统 程 序 中, 如 果 说 应 用 程 序 在 多 中 形 式 的 终 端 上 使 用 时, 推 荐 使 用 服 务 层, 当 然 如 果 你 的 系 统 中 只 有 一 种 类 型 的 前 端 表 现 形 式 时, 例 如 Web 应 用 程 序, 只 有 一 个 前 端 要 求 时, 例 如 通 过 浏 览 器 访 问 的 形 式, 并 且 业 务 逻 辑 层 能 够 很 好 的 与 表 现 层 交 互 时, 那 么 如 果 我 们 还 把 业 务 逻 辑 与 表 现 层 直 接 的 通 信 抽 出 来 通 过 服 务 层 来 完 成 的 话, 那 么 服 务 层 只 是 完 成 任 务 的 转 发, 并 没 有 实 际 行 的 好 处 及 减 少 开 销, 那 么 此 时 不 推 荐 使 用 服 务 层 我 们 来 总 结 下 服 务 层 的 优 势 与 劣 势, 已 衡 量 我 们 在 系 统 中 使 用 服 务 层 的 必 要 性 :
五 服 务 层 实 战 前 面 已 经 讲 述 了 服 务 层 的 优 缺 点 及 应 用 场 景 的 介 绍, 那 么 我 们 本 节 中 将 要 详 细 的 讲 解 服 务 层 设 计 的 几 种 模 式, 主 要 是 体 现 出 服 务 层 设 计 实 现 的 几 个 思 路, 方 便 我 们 在 项 目 的 实 践 过 程 中 少 走 弯 路 为 我 们 的 系 统 带 来 更 好 的 适 应 性 及 扩 展 性 要 求 我 们 闲 来 将 第 一 类 模 式 装 饰 模 式 在 服 务 层 的 含 义, 跟 设 计 模 式 中 的 装 饰 模 式 可 以 说 是 有 着 异 曲 同 工 之 妙, 就 是 将 服 务 层 的 一 系 列 方 法 包 装 成 干 净 的 接 口, 以 供 外 部 调 用, 通 过 该 模 式, 我 们 能 够 将 细 粒 度 的 服 务 包 装 成 粗 粒 度 的 服 务, 这 样 可 以 更 方 便 的 为 表 现 层 服 务, 并 且 可 以 通 过 装 饰 模 式 将 服 务 包 装 成 远 程 调 用 服 务 的 方 式, 具 体 内 部 的 实 现 都 不 是 主 要 的 关 注 点, 对 客 户 来 说, 他 们 可 以 以 统 一 的 方 式 不 管 客 户 端 的 形 式 是 怎 么 样 的 我 们 都 知 道 面 向 对 象 的 设 计 原 则 是 要 求 某 个 对 象 功 能 单 一, 尽 可 能 的 简 单, 但 是 通 常 我 们 在 表 现 层 中 的 一 些 业 务 流 程 中 要 求 有 多 个 实 体 之 间 进 行 交 互 时, 那 么 我 们 通 过 服 务 来 组 织 就 会 显 得 比 较 好, 我 们 通 过 装 饰 模 式 来 实 现 这 样 的 业 务 要 求 就 会 比 较 好, 我 们 将 一 系 列 细 粒 度 比 较 复 杂 的 业 务 逻 辑 放 在 一 个 服 务 的 API 方 法 中, 表 现 层
通 过 调 用 这 个 方 法 来 完 成 复 杂 的 业 务 逻 辑 交 互 服 务 层 中 的 装 饰 模 式 更 关 心 的 是 如 何 为 表 现 层 提 供 更 好 的 服 务, 隐 藏 内 部 的 细 节, 下 面 我 们 来 看 看 相 关 的 例 子 吧, 我 们 这 里 还 是 以 购 物 流 程 来 说 吧 购 物 流 程 的 简 单 流 程 可 能 如 此, 那 么 当 然 我 们 在 购 物 流 程 中 还 有 其 他 的 服 务, 比 如 我 们 在 购 物 的 过 程 中 的 短 信 提 醒 给 卖 家, 或 者 说 是 发 送 邮 件 给 卖 家 等 这 些 是 我 们 系 统 提 供 的 服 务, 包 括 一 些 日 志 性 的 服 务 那 么 这 些 我 们 如 何 去 做 呢? 当 然 在 上 面 的 流 程 中, 用 户 只 需 要 关 系 最 后 的 一 步, 提 交 订 单, 付 款 的 环 节, 当 用 户 付 款 后 会 给 用 户 发 送 短 信, 那 么 显 然 我 们 在 服 务 中 就 可 以 把 下 单 的 过 程 中 默 认 提 供 系 统 日 志, 系 统 安 全, 权 限 等 等 问 题 一 并 处 理, 而 给 客 户 提 供 的 方 法 则 只 包 含 支 付 的 接 口 public interface IPay /// 支 付 接 口 /// <param name="product"></param> void Pay(Rule.Product product); 上 面 我 们 定 义 了 支 付 的 接 口, 来 看 业 务 层 中 的 订 单 操 作 :
public class Order /// 添 加 产 品 /// <returns></returns> public int Add(Product product) return 0; /// 保 存 /// <returns></returns> public int Save() return 0; /// 删 除 /// <returns></returns> public int Delete() return 0; /// 更 新 /// <returns></returns>
public int Update() return 0; 我 们 来 看 看 服 务 类 中 接 口 的 实 现 : public class Pay : IPay public bool PayMent(Rule.Product product) // 具 体 的 下 单 操 作 Rule.Order order = new Rule.Order(); // 持 久 化 操 作 order.add(product); // 发 送 手 机 短 信, 发 送 给 卖 家, 通 知 有 人 买 什 么 产 品 等 SendMessage.Instance.SendMsg(string.Empty, string.empty); return true; #region IPay 成 员 public void IPay.Pay(Rule.Product product) this.payment(product); #endregion 那 么 上 面 我 们 在 服 务 层 组 合 多 个 简 单 的 服 务 提 供 给 一 个 方 法, 那 么 UI 层 只 要 简 单 的 调 用 服 务 层 接 口 中 提 供 的 方 法 即 可, 就 能 完 成 服 务 的 调 用 我 们 来 看 看 UI 层 的 代 码
public class Order public void Pay() Service.PayFactory factory=new Service.PayFactory(); // 调 用 服 务 层 中 的 支 付 Service.IPay pay = factory.createpay(); // 这 里 只 是 测 试, 所 以 没 有 屏 蔽 New 的 代 码 pay.pay(new Rule.Product()); 那 么 通 过 上 面 的 简 单 形 式 我 们 就 完 成 了 一 个 简 单 的 装 饰 模 式 的 服 务 层 的 设 计, 是 不 是 很 简 单 呢? 可 能 看 起 来 代 码 有 点 多, 不 过 这 样 的 设 计 很 利 于 我 们 在 后 期 的 扩 展 性 和 适 应 性, 特 别 是 等 到 系 统 的 功 能 更 复 杂 更 多 时 好 的 设 计 就 能 体 现 出 它 的 价 值 了 当 然 上 面 我 们 通 过 了 直 接 使 用 领 域 模 型 中 的 对 象 作 为 数 据 传 输, 当 然 我 们 可 以 通 过 数 据 传 输 对 象 的 自 定 义 对 象 来 完 成, 情 况 更 好, 我 这 里 就 不 举 例 说 明 了, 下 面 我 们 来 讲 述 下 一 个 模 式 : 传 输 对 象 模 式 那 么 我 们 前 面 也 讲 过 了 数 据 传 输 对 象, 其 实 这 个 模 式 只 是 讲 解 了 数 据 传 输 对 象 的 用 法 传 输 对 象 模 式 : 该 模 式 主 要 是 针 对 系 统 中 各 分 层 之 间 的 数 据 传 输 模 式 的 设 计, 通 过 传 输 对 象 可 以 降 低 各 层 之 间 分 发 数 据 的 次 数, 提 高 系 统 性 能, 通 常 来 说 该 模 式 非 常 有 用 但 是 也 有 它 的 弊 端 比 如 说 当 领 域 模 型 太 多 的 时 候, 如 果 把 领 域 模 型 中 的 每 个 对 象 的 数 据 载 体, 都 设 计 成 传 输 对 象, 那 么 系 统 将 是 一 个 非 常 庞 大 的 工 程, 因 为 过 度 设 计, 让 系 统 难 于 维 护 与 控 制 我 们 来 总 结 下 使 用 该 模 式 的 优 缺 点 :
那 么 有 优 点 肯 定 就 有 缺 点, 我 们 来 看 看 传 输 对 象 可 能 带 来 的 劣 势 : 现 在 目 前 我 们 在 使 用 数 据 传 输 对 象 的 时 候, 都 必 须 手 动 的 去 维 护 及 创 建, 目 前 没 有 比 较 好 的 工 具 去 完 成 自 动 创 建 的 功 能 比 如 说 能 将 同 一 个 对 象, 根 据 不 同 UI 的 需 求 自 动 的 将 一 些 属 性 屏 蔽 或 者 启 用 等 可 能 通 过 XML 配 置 文 件 来 完 成 会 是 可 行 的 方 案, 不 过 目 前 还 没 有 一 个 比 较 好 的 工 具 去 自 动 的 根 据 领 域 模 型 中 的 对 象 自 动 的 创 建 传 输 对 象, 然 后 还 能 提 供 这 个 传 输 对 象 根 据 不 同 UI 界 面 要 求 完 成 不 同 的 自 定 义 配 置 功 能, 希 望 各 位 如 果 了 解 的 可 以 给 小 弟 指 点 下, 跪 求! 传 输 对 象 模 式 我 想 具 体 的 实 例 代 码 我 就 简 单 的 书 写 下 吧, 就 是 把 对 象 中 的 行 为 去 掉, 只 包 含 数 据 信 息, 就 和 我 们 平 时 说 的 3 层 结 构 中 的 Model 层 一 样, 只 有 get;set; 访 问 器 和 私 有 成 员 变 量, 我 们 来 看 看 实 例 代 码 吧? /// 产 品 信 息 public class Product private int _pro_id; private string _pro_property = string.empty; private string _pro_cid; private int? _pro_brandid; private string _pro_name;
private string _pro_model; /// 产 品 ID public int pro_id set _pro_id = value; get return _pro_id; /// 扩 展 属 性 值 public string pro_property set _pro_property = value; get return _pro_property;
/// 商 品 分 类 public string pro_cid set _pro_cid = value; get return _pro_cid; /// 商 品 品 牌 public int? pro_brandid set _pro_brandid = value; get return _pro_brandid; /// 商 品 名 称
public string pro_name set _pro_name = value; get return _pro_name; /// 商 品 型 号 public string pro_model set _pro_model = value; get return _pro_model; 我 这 里 提 供 一 个 我 认 为 的 生 成 领 域 模 型 的 思 路, 主 要 还 是 通 过 XML 文 件 来 完 成, 将 具 体 的 数 据 传 输 对 象 不 是 通 过 类 文 件 的 形 式 来 完 成, 通 过 序 列 化 成 XML 文 件 来 完 成, 这 样 就 相 当 于 每 个 XML 对 应 一 个 序 列 化 文 件, 然 后 这 个 文 件 中 会 保 存 相 应 的 配 置 信 息, 比 如 说 哪 个 页 面 显 示 哪 些 字 段, 那 个 页 面 调 用 这 个 类 时 不 掉 用 这 个 页 面 具
体 的 配 置 通 过 提 供 一 个 可 视 化 的 方 式 来 维 护 就 好 了, 然 后 在 前 台 绑 定 的 时 候 根 据 读 取 或 者 写 入 XML 文 件 来 完 成, 可 能 这 也 是 比 较 灵 活 的 方 式, 具 体 的 实 现 我 没 有 去 做, 请 大 家 提 出 更 好 的 思 路, 小 弟 谢 过! 我 们 接 下 来 讲 述 第 三 种 模 式 : 适 配 器 模 式, 这 个 也 是 设 计 模 式 中 最 常 用 的 设 计 模 式 的 一 种, 适 配 器 模 式 的 主 要 作 用 是 将 某 个 接 口 转 换 成 我 们 需 要 的 另 外 一 个 接 口, 这 个 怎 么 理 解 呢? 我 们 把 手 机 服 务 包 装 成 MP3 的 接 口, 或 者 把 MP3 的 接 口 包 装 成 手 机, 都 是 可 以 的, 可 能 我 这 里 的 例 子 举 得 不 合 适 但 是 意 思 就 是 将 某 种 服 务, 通 过 适 配 器 转 换 成 另 外 一 种 服 务 我 这 里 简 单 的 讲 解 几 个 例 子 来 完 整 适 配 器 模 式 的 介 绍, 我 们 先 以 将 传 输 对 象 转 换 为 我 们 的 领 域 模 型 中 的 对 象, 通 过 适 配 器 来 完 成 数 据 的 转 换 我 们 先 来 看 看 不 通 过 适 配 器 模 式 来 完 成 领 域 对 象 中 的 类 与 传 输 对 象 之 间 的 交 互, 通 过 构 造 函 数 注 入 的 方 式 来 完 成 /// 产 品 信 息 public class ProductCase private Product _product; public ProductCase(Product product) _product = product; /// 产 品 ID public int pro_id
set _product.pro_id = value; get return _product.pro_id; /// 扩 展 属 性 值 public string pro_property set _product.pro_property = value; get return _product.pro_property; /// 商 品 分 类 public string pro_cid set
_product.pro_cid = value; get return _product.pro_cid; /// 商 品 品 牌 public int? pro_brandid set _product.pro_brandid = value; get return _product.pro_brandid; /// 商 品 名 称 public string pro_name set _product.pro_name = value;
get return _product.pro_name; /// 商 品 型 号 public string pro_model set _product.pro_model = value; get return _product.pro_model; 上 面 的 方 式 通 过 构 造 函 数 的 注 入 完 成 相 应 的 访 问, 通 过 get;set; 访 问 器 来 完 成 下 面 我 们 通 过 适 配 器 的 方 式 来 实 现 转 换, 看 看 有 什 么 不 同 : public class ProductTest private Product _product; public ProductTest(Product product)
ProductAdapter adapter = new ProductAdapter(product); adapter.initdto(this); 下 面 看 看 具 体 的 适 配 器 中 的 代 码 : public class ProductAdapter private Product _product; public ProductAdapter(Product product) this._product = product; public bool InitDTO(ProductTest test) // 赋 值 的 过 程, 将 Product 中 的 信 息 转 换 为 ProductTest 对 象 test.pro_brandid = _product.pro_brandid; //... return true; 我 们 上 面 看 到 了, 通 过 依 赖 注 入 的 形 式, 将 要 包 装 的 接 口 传 入 到 适 配 器, 然 后 在 适 配 器 的 内 部 进 行 相 应 的 包 装, 传 出 包 装 后 的 接 口, 这 就 是 一 个 完 整 的 适 配 器 流 程, 具 体 的 业 务 逻 辑 就 是 根 据 需 要 来 做 了 通 过 上 面 的 方 式 我 们 的 确 完 成 了 相 应 的 转 换, 不 过 转 换 的 代 价 是 非 常 的 大, 不 过 有 的 时 候 我 们 的 业 务 需 求 是 这 样 的, 可 能 我 们 也 没 有 更 好 的 办 法, 只 能 通 过 这 样 的 方 式 来 做, 可 能 对 解 决 方 案 的 实 现 比 效 率 更 有 价 值 其 实 我 们 在 使 用 传 输 对 象 的 时 候 还 是 需 要 仔 细 的 斟 酌 项 目 的 需 求, 看 看 是 不 是 必 须 要 使 用 这 个, 如 果 不 是 必 须 的, 其 实 我 们 可 以 不 需 要 强 迫 性 的 使 用 六 本 文 总 结
本 章 主 要 讲 述 了 系 统 架 构 中 的 服 务 层 的 架 构 中 的 注 意 事 项 及 几 个 简 单 的 设 计 模 式 及 使 用, 并 且 讲 述 了 服 务 层 应 用 的 场 景 和 带 来 的 好 处, 当 然 我 们 也 需 要 服 务 层 的 优 劣 处, 还 有 就 是 服 务 的 实 现 方 案, 本 文 前 面 可 能 没 有 讲 解 发 布 服 务 的 几 种 方 式, 这 里 简 单 的 用 图 来 说 明 下 吧? WCF 已 经 内 置 继 承 了 remoting, socket 和 SOAP 的 方 式 来 进 行 远 程 调 用 服 务, 当 然 HTTP 方 式 的 SOAP 的 服 务 方 式, 还 是 推 荐 使 用 Web 服 务 的 方 式 来 做 七 系 列 进 度 前 篇 1 系 统 架 构 师 - 基 础 到 企 业 应 用 架 构 系 列 之 -- 开 卷 有 益 2 系 统 架 构 师 - 基 础 到 企 业 应 用 架 构 - 系 统 建 模 [ 上 篇 ] 3 系 统 架 构 师 - 基 础 到 企 业 应 用 架 构 - 系 统 建 模 [ 中 篇 ]( 上 ) 4 系 统 架 构 师 - 基 础 到 企 业 应 用 架 构 - 系 统 建 模 [ 中 篇 ]( 下 ) 5 系 统 架 构 师 - 基 础 到 企 业 应 用 架 构 - 系 统 建 模 [ 下 篇 ] 6 系 统 架 构 师 - 基 础 到 企 业 应 用 架 构 - 系 统 设 计 规 范 与 原 则 [ 上 篇 ] 7 系 统 架 构 师 - 基 础 到 企 业 应 用 架 构 - 系 统 设 计 规 范 与 原 则 [ 下 篇 ] 8 系 统 架 构 师 - 基 础 到 企 业 应 用 架 构 - 设 计 模 式 [ 上 篇 ] 9 系 统 架 构 师 - 基 础 到 企 业 应 用 架 构 - 设 计 模 式 [ 中 篇 ] 10 系 统 架 构 师 - 基 础 到 企 业 应 用 架 构 - 设 计 模 式 [ 下 篇 ] 中 篇 11 系 统 架 构 师 - 基 础 到 企 业 应 用 架 构 - 企 业 应 用 架 构 12 系 统 架 构 师 - 基 础 到 企 业 应 用 架 构 - 分 层 [ 上 篇 ] 13 系 统 架 构 师 - 基 础 到 企 业 应 用 架 构 - 分 层 [ 中 篇 ] 14 系 统 架 构 师 - 基 础 到 企 业 应 用 架 构 - 分 层 [ 下 篇 ]
15 系 统 架 构 师 - 基 础 到 企 业 应 用 架 构 - 表 现 层 16 系 统 架 构 师 - 基 础 到 企 业 应 用 架 构 - 服 务 层 17 系 统 架 构 师 - 基 础 到 企 业 应 用 架 构 - 业 务 逻 辑 层 18 系 统 架 构 师 - 基 础 到 企 业 应 用 架 构 - 数 据 访 问 层 19 系 统 架 构 师 - 基 础 到 企 业 应 用 架 构 - 组 件 服 务 20 系 统 架 构 师 - 基 础 到 企 业 应 用 架 构 - 安 全 机 制 后 篇 21 单 机 应 用 客 户 端 / 服 务 器 多 服 务 企 业 数 据 总 线 全 解 析 22 系 统 架 构 师 - 基 础 到 企 业 应 用 架 构 - 单 机 应 用 ( 实 例 及 demo) 23 系 统 架 构 师 - 基 础 到 企 业 应 用 架 构 - 客 户 端 / 服 务 器 ( 实 例 及 demo) 24 系 统 架 构 师 - 基 础 到 企 业 应 用 架 构 - 多 服 务 ( 实 例 及 demo) 25 系 统 架 构 师 - 基 础 到 企 业 应 用 架 构 - 企 业 数 据 总 线 ( 实 例 及 demo) 26 系 统 架 构 师 - 基 础 到 企 业 应 用 架 构 - 性 能 优 化 ( 架 构 瓶 颈 ) 27 系 统 架 构 师 - 基 础 到 企 业 应 用 架 构 - 完 整 的 架 构 方 案 实 例 [ 上 篇 ] 28 系 统 架 构 师 - 基 础 到 企 业 应 用 架 构 - 完 整 的 架 构 方 案 实 例 [ 中 篇 ] 29 系 统 架 构 师 - 基 础 到 企 业 应 用 架 构 - 完 整 的 架 构 方 案 实 例 [ 下 篇 ] 30 系 统 架 构 师 - 基 础 到 企 业 应 用 架 构 - 总 结 及 后 续 八 下 篇 预 告 下 一 篇 我 们 将 会 开 始 讲 解 软 件 设 计 中 最 重 要 也 是 最 基 本 的 技 能 - 设 计 模 式, 希 望 大 家 多 多 提 出 已 经, 后 面 3 篇 我 们 将 会 讲 解 如 何 在 项 目 中 使 用 设 计 模 式 及 使 用 设 计 模 式 需 要 注 意 的 事 项, 将 会 举 例 说 明 每 个 设 计 模 式 可 能 出 现 的 场 景 希 望 大 家 持 续 关 注!