我有一个ASP.NET MVC解决方案,我在ASP.NET MVC项目中有大量的HtmlHelper类,它们获取数据并生成各种html片段以显示在各种页面上.
我现在必须运行一堆预定的工作,其中许多工作会生成电子邮件.我将所有这些工作都移到了解决方案中的一个单独的项目中(称为AdminJob.csproj),但我现在发现我必须生成一些与我在视图页面中具有非常相似的HTML的电子邮件.我试图让管理工作不依赖于ASP.NET MVC项目(因为我希望在需要时将adminjob项目作为命令行运行),我也想避免使用我的ASP.NET MVC项目依赖于AdminJob项目(因为这看起来很奇怪).
有关如何避免在我的ASP.NET MVC项目和AdminJob项目中重复相同的HTML呈现代码的任何建议?
我唯一能想到的是在解决方案中创建另一个名为"ViewHelpers"的项目或类似的东西,并将我的所有HTMLHelpers移动到该项目中,以便我的MVC项目和AdminJob项目都可以引用它.为这段代码创建一个单独的项目似乎有点过分,但我想不出另一个不会产生重复的解决方案.
有什么其他建议可以更好地做到这一点并避免重复吗?
我看待这个的方式是电子邮件是一种视图类型.我的网络应用程序中有几种视图类型(html,email,pdf,rss等).这种模式有几种实现:在rails上的ruby中的ActionMailer或者到asp.net的端口:MvcMailer.
这样,您可以在Web应用程序和电子邮件中充分利用Razor引擎,以减少重复.
您可以在另一个项目中托管您的视图,并通知ViewEngine在哪里查找视图(请参阅ASP.NET MVC中单独程序集中的视图).我发现这有点矫枉过正.
另一种方式 - 我使用的方法 - 是将电子邮件模板与其他视图放在同一个项目中.
如果要在Web应用程序之外呈现视图,可以使用以下方法之一在控制台应用程序中编译剃刀模板:
RazorTemplates:https://github.com/volkovku/RazorTemplates
RazorEngine:https://github.com/Antaris/RazorEngine
使用像MvcMailer这样的东西,您可以在计划任务中发出curl请求.MvcMailer需要运行HttpContext,因此您无法从控制台应用程序运行它.卷曲mvc行动会起作用.