上周跟一位猎头在google talk上聊了几句,被问道有没有WCF、WF的经验,对于WCF、WF,没有任何经验,但是这并不代表着我对SOA没有任何经验,其实去年一年,我们都是在用NerviceBus作为实现SOA的工具。百度了一下,发现有个园友似水流年已经写过一篇介绍NServiceBus的文章,“NServiceBus—最流行的开源企业服务总线 for .Net”。那我就不再雷同,今天就给大家介绍一下如何在实际项目中使用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。IBus是NServiceBus的接口。
以下是引用片段: 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 } |
当你实现了上面六个环节之后,在visual studio中设定”Set Startup Project”,选中新创建的class library。接下来F5,你会发现除了正常的MVC项目启动之外,还有一个background application 也会同时启动。当你在系统中新创建一个管理员时,NServiceBus将向你的管理员发送他首次登陆密码。
希望这篇文章对大家在了解和使用NSerivecBus搭建SOA类型的项目时,有一定的帮助。期待看到越来越多的人喜欢上NServiceBus。
我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。
我原创,你原创,我们的内容世界才会更加精彩!
【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】
微信公众号
TechTarget
官方微博
TechTarget中国
作者
相关推荐
-
企业设计:三层架构是否仍然有效?
你是否想说三层企业架构已经走到了它的心头呢?如果不是,那么为什么不呢?如果是,那么什么又将会取代它呢?
-
国外十大最流行PHP框架排名
PHP以简单易学而深受程序员的喜爱,那么对于PHP你都了解多少,你知道有哪些颇受欢迎的PHP框架吗?
-
JavaScript开发创建类:向模块化进军
大家都知道,JavaScript是基于原型的编程语言,并没有包含内置类的实现。但通过JavaScript可以轻易地模拟出经典的类。
-
嵌入式系统中MVC模式如何运用?
我是模块化和面向对象编程的忠实拥趸。仅仅因为没有足够的内存去使用Matlab不能成为不考虑自己的心态应该如何设计的借口。