0

I have the following Interface in my C# project, which should return a html page to send as template email from a model:

namespace Project.Templates
{
    public interface IRazorViewToStringRenderer
    {
        Task<string> RenderViewToStringAsync<TModel>(string viewName, TModel model);
    }
    public class RazorViewToStringRenderer : IRazorViewToStringRenderer
    {
        private readonly IRazorViewEngine _viewEngine;
        private readonly ITempDataProvider _tempDataProvider;
        private readonly IServiceProvider _serviceProvider;

        public RazorViewToStringRenderer(
          IRazorViewEngine viewEngine,
          ITempDataProvider tempDataProvider,
          IServiceProvider serviceProvider)
        {
            _viewEngine = viewEngine;
            _tempDataProvider = tempDataProvider;
            _serviceProvider = serviceProvider;
        }

        public async Task<string> RenderViewToStringAsync<TModel>(string viewName, TModel model)
        {
            var actionContext = GetActionContext();
            var view = FindView(actionContext, viewName);

            using (var output = new StringWriter())
            {
                var viewContext = new ViewContext(
                  actionContext,
                  view,
                  new ViewDataDictionary<TModel>(new EmptyModelMetadataProvider(), new ModelStateDictionary())
                  {
                      Model = model
                  },
                  new TempDataDictionary(actionContext.HttpContext, _tempDataProvider),
                  output,
                  new HtmlHelperOptions());

                await view.RenderAsync(viewContext);

                return output.ToString();
            }
        }
...

    }
}

And i would use that interface in my Helper class, i was trying to declare it and use as the following but in each case the _renderer is null..

private readonly IRazorViewToStringRenderer _renderer;
        
        public async Task<bool> SendRiepilogoAsync(RiepilogoTakeaway ordine)
        {
            try
            {

                ...
                var htmlBody = await _renderer.RenderViewToStringAsync("~/Views/Emails/EmailRiepilogo.cshtml", model);

                var message = new MailMessage(from, to)
                {
                    Subject = "Riepilogo ordine!",
                    Body = htmlBody
                };

...
}

I was trying to initialize the interface with new but it was anyway returning null in _renderer

Kasper Juner
  • 832
  • 3
  • 15
  • 34
  • 2
    The `_renderer` needs to be initialized, likely with dependency injection (e.g. constructor parameter, where you pass instance of class implementing this interface). – Sinatr Sep 28 '20 at 13:16
  • @Sinatr i've added `public EmailHelper(IRazorViewToStringRenderer renderer) { _renderer = renderer; }` to my EmailHelper, but when calling an istance of it, what should i pass in the constrcutor? – Kasper Juner Sep 28 '20 at 13:25
  • 1
    It has to be an instance of class, what implement `IRazorViewToStringRenderer`. You have shown a class implementing it (`RazorViewToStringRenderer`), create new instance of it and pass into `EmailHelper` constructor. – Sinatr Sep 28 '20 at 13:31
  • 1
    Does this answer your question? [Creating an instance of a interface in c#](https://stackoverflow.com/questions/17708528/creating-an-instance-of-a-interface-in-c-sharp) – Sinatr Sep 28 '20 at 13:32

0 Answers0