轻轻松松SOA: NServiceBus

项目名称叫Workflow, 是为一家在荷兰的呼叫中心客户化定制开发一款帮助他们管理工作流的系统。这个系统采用Domain Driven Design作为整个项目的总体设计方案。商业逻辑(business logic)在Domain model实现,Domain model用POCO(plain old c# object)实现,Domain model凭借fluent nhibernate map到数据库。Web部分采用ASP.NET MVC 2.0,StructureMap做为IoC container,  所以在controller里面就可以方便的使用接口I*whatever*Service来inject服务层。 当然了,项目中用到Messaging的部分是借用NserviceBus实现的。

 

因为整个系统中频繁用到给用户发邮件的功能,所以下面我就给大家介绍一下如果用NServiceBus实现Email messaging.

 

0. 在MVC project Web.config文件中,添加下面的配置, 主要目的是设置发送出去的message到达的终点站。

复制代码
  
  
1 < UnicastBusConfig > 2    < MessageEndpointMappings > 3    < add Messages = " Workflow.Messages.Email.EmailMessage, Workflow.Messages " Endpoint = " EmailQueue " /> 4 </ MessageEndpointMappings > 5 </ UnicastBusConfig > 6
复制代码

 

1. 在Controller constructor 里面inject IEmailService

 

  
  
1 public AdministratorsController( IUserMailer userMailer) 2 { 3 this .userMailer = userMailer; 4 }

 

 

2. 大家注意第10行,当新添加一个administrator之后,调用userMailer服务,来给这个新添加的管理员发送密码。

 

复制代码
  
  
1 public Url Post(AddAdministratorViewModel model) 2 { 3 if ( ! ModelState.IsValid) 4 { 5 return model; 6 } 7 8 var administrator = administratorFactory.Create(model.UserName, model.Email); 9 adminRepository.Add(administrator); 10 userMailer.SendPasswordNotification(administrator); 11 12 return new AdministratorUrl { Administrator = administrator }; 13 }
复制代码

 

 

3. 接下来在ApplicationService层里,UserMailer类继承IUserMailer, 同样在UserMailer constructor里面 inject IBus. IBusNServiceBus的接口。

 

  
  
1 public UserMailer(IBus bus) 2 { 3 this .bus = bus; 4 }

 

 

4. 第8行创建一个新的EmailMessage对象, 第9行用bus 发送这个对象。

 

复制代码
  
  
1 public void SendPasswordNotification(User user) 2 { 3 if (user == null ) 4 { 5 throw new ArgumentNullException( " user " ); 6 } 7 8 var email = new EmailMessage("from", "to", "title" , "body"); 9 bus.Send(email); 10 }
复制代码

 

5. EmailMessage 类需要继承IMessage, IMessage是NServiceBus的一个接口,表明这个类符合NServiceBus对Message的定义,同时可以被NServiceBus处理。

  
  
1 public class EmailMessage : IMessage 2 { 3   // EmailMessage implementation goes here; 4 }

 

6. 最后一个环节就是在Solution中创建一个新的class library, 可以作为background service来实际发送邮件。在实现这个class library的时候,有基本上有3个方面需要注意:

1). App.config, 第4, 5, 7三行是特别用来配置NServiceBus. 在MsmqTransportConfig这一行,确保InputQueue是你在第0步骤中设定的Message要达到终点站的名字

复制代码
  
  
1 <? xml version = " 1.0 " ?> 2   < configuration > 3 < configSections > 4 < section name = " MsmqTransportConfig " type = " NServiceBus.Config.MsmqTransportConfig, NServiceBus.Core " /> 5 < section name = " Logging " type = " NServiceBus.Config.Logging, NServiceBus.Core " /> 6 </ configSections > 7 < MsmqTransportConfig ErrorQueue = " error " InputQueue = " EmailQueue " MaxRetries = " 5 " NumberOfWorkerThreads = " 1 " /> 8 < startup > 9 < supportedRuntime sku = " .NETFramework,Version=v4.0 " version = " v4.0 " /> 10 </ startup > 11   </ configuration >
复制代码

 

2). MessageEndPoint.cs, 这个类继承了NServiceBus的几个接口, IConfiureThisEndpoint (表明这个类是终点站的配置类), AsA_Server(表明这个终点站是个服务器), IWantCustomerInitialization(表明我们需要自己的container 和 serializer)

复制代码
  
  
1 public class MessageEndpoint : IConfigureThisEndpoint, AsA_Server, IWantCustomInitialization 2 { 3 public void Init() 4 { 5 Configure.With() 6 .StructureMapBuilder(ObjectFactory.Container) 7 .XmlSerializer(); 8 } 9 }
复制代码

 

3). EmailHandler.cs: 当EmailMessage 这个类型的message到达中间站的时候,我们要对这个message的操作在此类中实现。在本例中,我们首先获得一个SmtpClient的实例,然后用我们的EmailMessage来创建一个System.Net.Mail.MailMessage的实例mail,最后用smtpclient将这个mail发送。搞定!

复制代码
  
  
1 public class EmailHandler : IHandleMessages < EmailMessage > 2 { 3      public void Handle(EmailMessage message) 4 { 5    try 6 { 7   var client = new SmtpClient(); 8 var htmlBody = " blah " ; 9 var mail = new MailMessage(message.From, message.To); 10 11 client.Send(mail); 12 } 13 catch (SmtpFailedRecipientsException) 14 { 15    // mail cannot be sent due to recipient specific error 16   } 17 } 18 }
复制代码
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
NServiceBus 是一个.Net平台下开源的消息服务框架,这类产品有时也被称作ESB(Enterprise Service Bus)——企业服务总线。NServiceBus也是dotnet世界里面最流行的开源企业服务总线。       NServiceBus 是一个用于构建企业级 .NET系统的开源通讯框架。它在消息发布/订阅支持、工作流集成和高度可扩展性等方面表现优异,因此是很多分布式系统基础平台的理想选择。,它能够帮助开发人员在搭建企业.NET系统时避免很多典型的常见问题。同时,该框架也提供了一些可伸缩的关键特征,比如对发布/订阅的支持、集成的长时间工作流及深入的扩展能力等。       NServiceBus的核心并不依赖于MSMQ。NServiceBus可扩展性允许我们插入自行编写的通信传送器,、订阅存储器和工作流的实现。 NServiceBus的特性1、高性能和可扩展性可以广泛应用于许多业务领域,可扩展性和性能都经过了实战检验。2、具有自动重试的可靠性集成通过配置机制提供基于消息通讯的的最佳实践方案,能够识别错误响应并自动重试。3、工作流和后台任务调度通过Saga来完成长时间运行的流程定义和管理功能,提供强大而灵活的工作流功能。4、消息的集中审核流程很容易将整个分布式系统聚集到一个中心位置配置消息审核。5、通过发布/订阅来减少耦合提供了发布/订阅机制。可扩展、可配置、易于理解和易于使用。6、易于扩展和配置多个灵活的扩展点和配置选项,NServieBus可以根据用户需求对各个特性进行自定义配置。7、支持广泛的消息传输技术提供了MSMQ, RabbitMQ, SQL Server, Windows Azure Queues,Windows AzureService Bus消息传输机制,当然你也可以自定义或者选择由社区开发的消息传输方案。NServicebus官方地址:http://particular.net/git: https://github.com/Particular/NServiceBusNServiceBus原作者Udi Dahan,该产品最早于2006年发行了第一个版本,这是一个企业级的开源产品,企业开发需要购买License,参照:http://particular.net/licensing。 标签:消息框架
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值