在这篇教程中我们将学习如何创建一个非常简单的由客户端向服务端发送消息的订单系统。该系统包括三个项目:Client、Server 和 Messages,我们将按照以下步骤来完成这个任务。

  1. 创建 Client 项目
  2. 创建 Messages 项目
  3. 创建 Server 项目
  4. 发送订单
  5. 运行解决方案

完整的解决方案代码可以在这里下载。

创建 Client 项目

让我们开始创建 Client 项目,它将负责发送订单请求到一个 NServiceBus 终结点(Endpoint)。

以管理员权限运行 Visual Studio,添加一个名叫“Ordering.Client”的类库项目,并且将解决方案命名为“Ordering”。

我们现在需要引用 NServiceBus 的程序集,最快的方式是使用 NuGet 包管理控制台。

打开 NuGet 包管理控制台:

输入以下命令:

PM> Install-Package NServiceBus.Host

注:需要重新加载项目

包安装程序将引用 NServiceBus 程序集并在 Client 项目中创建几个模板文件。

例如,“EndpointConfig.cs” 被用来配置项目的终结点,并且自动应用了服务端配置。

为了将配置修改为客户端配置,我们需要打开“EndpointConfig.cs”文件并修改以下代码:

namespace Ordering.Client
{
public class EndpointConfig : IConfigureThisEndpoint, AsA_Server
{
}
}

修改后的代码如下:

namespace Ordering.Client
{
public class EndpointConfig : IConfigureThisEndpoint, AsA_Client
{
}
}

注:仅继承的基类由 AsA_Server 修改为 AsA_Client。

稍后我们将在 Client 项目中添加更多代码,现在让我们先把焦点放在如何处理订单请求上面。

创建 Messages 项目

首先添加一个名叫“Ordering.Messages”的类库项目。

该项目将包含消息定义,并且将由客户端和服务端共享,这样两边都将获得强类型的消息描述。

在该项目中安装“NServiceBusInterfaces”NuGet包,在包管理控制台,输入以下命令:

PM> Install-Package NServiceBus.Interfaces -ProjectName Ordering.Messages

添加一个“PlaceOrder.cs”文件,在其中添加以下代码:

namespace Ordering.Messages
{ public class PlaceOrder : ICommand
{
public Guid Id { get; set; } public string Product { get; set; }
}
}

创建 Server 项目

现在我们可以开始创建处理订单的服务端,首先添加一个名为“Ordering.Server”的类库项目。

为该项目安装“NServiceBusHost”NuGet包,在包管理控制台,输入以下命令:

PM> Install-Package NServiceBus.Host -ProjectName Ordering.Server

注:需要重新加载项目

添加对 Messages 项目的引用,以便服务端解释消息内容。

添加一个“PlaceOrderHandler.cs”文件,向其中写入以下代码:

namespace Ordering.Server
{
public class PlaceOrderHandler : IHandleMessages<PlaceOrder>
{
public IBus Bus { get; set; } public void Handle(PlaceOrder message)
{
Console.WriteLine(@"Order for Product:{0} placed with id: {1}", message.Product, message.Id);
}
}
}

发送订单

我们差不多快做好了,现在唯一剩下的就是回到 Client 项目中,添加对 Messages 项目的引用,并添加一个“SendOrder.cs”文件,向其中写入以下代码:

namespace Ordering.Client
{
public class SendOrder : IWantToRunWhenBusStartsAndStops
{
public IBus Bus { get; set; } public void Start()
{
Console.WriteLine("Press 'Enter' to send a message.To exit, Ctrl + C"); while (Console.ReadLine() != null)
{
var id = Guid.NewGuid(); Bus.Send("Ordering.Server", new PlaceOrder() { Product = "New shoes", Id = id}); Console.WriteLine("==========================================================================");
Console.WriteLine("Send a new PlaceOrder message with id: {0}", id.ToString("N"));
}
}
public void Stop()
{
}
}
}

注:以上代码基于 4.x 版本,若使用 3.x 版本需要使用 “IWantToRunAtStartup”接口。

运行解决方案

已经完成编码了,现在是时候运行解决方案了。

在解决方案中设置启动项目,将 Client 和 Server 项目设置为同时运行。

最后点击 F5 按钮运行解决方案,即可看到整个系统。

将会有两个控制台应用程序启动,在客户端控制台中按下回车,将在服务端窗口中看到“Order for Product: New shoes placed”。

恭喜 - 你刚完成了你的第一个 NServiceBus 程序。

简单吧。

如果你在控制台中看到警告,不用担心,这些警告只是 NServiceBus 告诉你它无法找到需要的队列,它将自动为你创建。

接下来学些什么

  • NServiceBus 入门之容错处理
  • NServiceBus 和 SOA 的架构原则

敬请期待。

NServiceBus官方文档翻译(二)NServiceBus 入门的更多相关文章

  1. NServiceBus官方文档翻译(一)NServiceBus 概况

    NServiceBus 概况 NServiceBus 被设计用来组合面向业务的服务,它并不是用来替代诸如 WCF 一类的RPC技术. NServiceBus 不只包含通信模块,像其他成熟的SOA和DD ...

  2. Orchard官方文档翻译(二) 安装 Orchard

    原文地址:http://docs.orchardproject.net/Documentation/Installing-Orchard 想要查看文档目录请用力点击这里 最近想要学习了解orchard ...

  3. Log4j官方文档翻译(二、架构设计)

    log4j遵循层次化架构,每个层都有不同的对象来执行不同的任务.这种层次话的结构灵活设计.易于未来的扩展. log4j框架中有两种对象: 核心对象:框架的支撑对象,是框架必不可少的组成部分. 支撑对象 ...

  4. Autofac官方文档翻译--二、解析服务--2隐式关系类型

    Autofac 隐式关系类型 Autofac 支持自动解析特定类型,隐式支持组件与服务间的特殊关系.要充分利用这些关系,只需正常注册你的组件,但是在使用服务的组件或调用Resolve()进行类型解析时 ...

  5. Autofac官方文档翻译--二、解析服务--1解析参数传递

    Autofac 传递解析参数 注册组件公开相应的服务之后,你可以从container构造器和子lifetime scopes 中解析服务.使用Resolve()方法来实现: var builder = ...

  6. Android官方文档翻译 二 1.Building Your First App

    Building Your First App 创建你的第一个App项目 Dependencies and prerequisites 依赖关系和先决条件 * Android SDK * ADT Pl ...

  7. Flume官方文档翻译——Flume 1.7.0 User Guide (unreleased version)(二)

    Flume官方文档翻译--Flume 1.7.0 User Guide (unreleased version)(一) Logging raw data(记录原始数据) Logging the raw ...

  8. omnet++:官方文档翻译总结(二)

    这一部分是官方案例介绍 1.Introduction 学习自:Introduction - OMNeT++ Technical Articles 本教程是基于Tictoc的仿真案例,这些案例我们可以在 ...

  9. Spring官方文档翻译(1~6章)

    Spring官方文档翻译(1~6章) 转载至 http://blog.csdn.net/tangtong1/article/details/51326887 Spring官方文档.参考中文文档 一.S ...

随机推荐

  1. BZOJ1011:[HNOI2008]遥远的行星(乱搞)

    Description 直线上N颗行星,X=i处有行星i,行星J受到行星I的作用力,当且仅当i<=AJ.此时J受到作用力的大小为 Fi->j=Mi*Mj/(j-i) 其中A为很小的常量, ...

  2. nginx静态文件缓存的解决方案

    nginx的一大功能就是完成静态资源的分离部署,减轻后端服务器的压力,如果给这些静态资源再加一级nginx的缓存,可以进一步提升访问效率. 第一步:添加nginx.conf的http级别的缓存配置 # ...

  3. spring amqp初步了解

    Rabbitmq简介 生产者会把消息发送给RabbitMQ的交换中心(Exchange),Exchange的一侧是生产者,另一侧则是一个或多个队列,由Exchange决定一条消息的生命周期--发送给某 ...

  4. 缩点tarjan

    给定一个n个点m条边有向图,每个点有一个权值,求一条路径,使路径经过的点权值之和最大.你只需要求出这个权值和.允许多次经过一条边或者一个点,但是,重复经过的点,权值只计算一次. 缩点含义:将一个环缩成 ...

  5. [转载]FFmpeg中使用libx264进行码率控制

    1.  X264显式支持的一趟码率控制方法有:ABR, CQP, CRF. 缺省方法是CRF.这三种方式的优先级是ABR > CQP > CRF. if ( bitrate )       ...

  6. 【LeetCode5】Longest Palindromic Substring★★

    1.题目描述: 2.解题思路: 题意:求一个字符串的最长回文子串. 方法一:中心扩展法.遍历字符串的每一个字符,如果存在回文子串,那么中心是某一个字符(奇数)或两个字符的空隙(偶数),然后分两种情况( ...

  7. ss客户端的使用

    这里假设读者已经搭建了ss服务.教程 客户端安装 客户端可以通过GitHub上搜索,这里就不写太详细了,避免文章被禁掉. 比如对于mac的用户,可以选择这个 客户端配置 点击程序图标以展开菜单栏 服务 ...

  8. 20155227《网络对抗》Exp6 信息收集与漏洞扫描

    20155227<网络对抗>Exp6 信息收集与漏洞扫描 实践目标 掌握信息搜集的最基础技能与常用工具的使用方法. 基础问题回答 哪些组织负责DNS,IP的管理. 全球根服务器均由美国政府 ...

  9. python基础学习1-变量定义赋值,屏幕输入输出

    一.变量定义赋值 输入输出屏幕显示 : name = input("input is your name") age =int( input("input is your ...

  10. 变量内存空间的释放---c语言

    堆栈内存释放: 栈的内存是由编译器自动分配.释放,出了作用域就释放. 堆的内存由程序员分配.释放,他的作用域是整个程序,如果程序没有释放,程序结束时会自动释放.