Asp.net MVC示例项目“Suteki.Shop”分析之NVelocity模版引擎2009-12-31 博客园 代震军在Suteki.Shop中使用了NVeloctiy模版引擎,用于提供可订制的邮件模版。而邮件的功能就是当定单 状态发生变化时,系统会向买家发送邮件通知。其中的邮件信息内容就是采用NVeloctiy的模版(.vm扩 展名)进行订制的。因为在Sutekie.Shop的最新源码包中只是部分实现了其功能,而全部的功能 还在完善中,所以要运行本文中所说的功能,需要在下面的链接地址中下载其最新程序文件(包括单元 测试文件):http://code.google.com/p/sutekishop/source/detail?r=282要下载的文件包括:
/branches/JtG_Enhancements/Suteki.Shop/Suteki.Shop/Views/EmailTemplates/OrderC onfirmation.vm
/branches/JtG_Enhancements/Suteki.Shop/Suteki.Shop/Views/EmailTemplates/OrderDispatch.vm
/branches/JtG_Enhancements/Suteki.Shop/Suteki.Shop/Views/EmailTemplates/_orderDetails.vm< br />/branches/JtG_Enhancements/Suteki.Shop/Suteki.Shop/Controllers/OrderStatusController.cs
/branches/JtG_Enhancements/Suteki.Shop/Suteki.Shop/Services/EmailService.cs 等等。当下载并覆盖(或添加)到本地项目中后,我们还需要在Castle Windsor 中注册相应的EmailBuilder组件。我们只要打开ContainerBuilder类并找到其Build方法 (Suteki.ShopContainerBuilder.cs),并添加如下代码:Component.For<IEmailService>().ImplementedBy<EmailService> ().LifeStyle.Singleton注:有关Castle Windsor 的 IOC的内容我已在这篇文章中做了介 绍.最终的代码如下所示:


container.Register(
Component.For<IUnitOfWorkManager> ().ImplementedBy<LinqToSqlUnitOfWorkManager>().LifeStyle.Transient,
Component.For<IFormsAuthentication> ().ImplementedBy<FormsAuthenticationWrapper>(),
Component.For<IServiceLocator>().Instance(new WindsorServiceLocator (container)),
Component.For<AuthenticateFilter>().LifeStyle.Transient,
Component.For<UnitOfWorkFilter>().LifeStyle.Transient,
Component.For<DataBinder>().LifeStyle.Transient,
Component.For<LoadUsingFilter>().LifeStyle.Transient,
Component.For<CurrentBasketBinder>().LifeStyle.Transient,
Component.For<ProductBinder>().LifeStyle.Transient,
Component.For<OrderBinder>().LifeStyle.Transient,
Component.For<IOrderSearchService>().ImplementedBy<OrderSearchService> ().LifeStyle.Transient,
Component.For<IEmailBuilder> ().ImplementedBy<EmailBuilder>().LifeStyle.Singleton,
Component.For<IEmailService>().ImplementedBy<EmailService> ().LifeStyle.Singleton //新加的代码
);


完成了这些工作后,我们就可以编译运行该项目了。下 面我们来看一下今天的主角 EMailBuilder,其实现了使用NVelocityEngine加载模版信息并将ViewData 中的数据与模版中的指定变量进行绑定的工作。下面是其类图: