После небольшого перебора источника Орчард и некоторого вдохновения, почерпнутого из почтового приложения Эндрю Дэйви, мне удалось найти решение.См фрагмент кода ниже
private void RenderMessage(MessageContext context, dynamic shape)
{
var httpContext = new EmailHttpContext(new Uri("http://localhost/orchard/"));
var routeData = new RouteData();
routeData.DataTokens.Add("IWorkContextAccessor", _workContextAccessor);
routeData.Values["controller"] = "Dummy";
var requestContext = new RequestContext(httpContext, routeData);
var controllerContext = new ControllerContext(requestContext, new DummyController());
var viewContext = new ViewContext(controllerContext, new ShapeView(shape), new ViewDataDictionary(shape.Model), new TempDataDictionary(), new StringWriter());
var scope = _workContextAccessor.CreateWorkContextScope(viewContext.HttpContext);
scope.WorkContext.CurrentTheme = _siteThemeService.GetSiteTheme();
var page = new EmailWebViewPage(viewContext, new ViewDataDictionary<dynamic>(shape.Model));
var displayHelperFactory = _services.WorkContext.Resolve<IDisplayHelperFactory>();
var display = displayHelperFactory.CreateHelper(page.ViewContext, page);
context.MailMessage.Body = display(shape).ToHtmlString();
scope.Dispose();
}
class DummyController : Controller
{
}
class ShapeView : IView
{
private readonly dynamic _shape;
public ShapeView(dynamic shape)
{
_shape = shape;
}
#region IView Members
public void Render(ViewContext viewContext, TextWriter writer)
{
}
#endregion
}
EmailHttpContext был взят из почтового проекта.Это использовалось для конструирования контроллера и просмотра контекстов.Затем мне просто нужно было расширить WebViewPage для Orchard, чтобы создать EmailWebViewPage, позволяющий мне подключаться к инфраструктуре Orchard для доступа к механизмам просмотра и т. Д.о чем я.
Если у кого-то есть отзывы или вы хотите получить полный код, напишите мне.