Skip to content

Asp.Net Core Service

Norbert Bietsch edited this page Jan 18, 2019 · 5 revisions

This is how to integrate MailMergeLib as a service into an ASP.NET Core 2.0 application.

Step 1: Create an interface for the service we will create.

public interface IMailMergeService
{
    IMessageStore MessageStore { get; }
    MailMergeSender Sender { get; }
    MailMergeMessage CreateDefaultMessage();
}

Step 2: Create the service class implementing the interface from step 1:

public class MailMergeService : IMailMergeService
{
    public MailMergeService(IOptions<MailMergeServiceConfig> serviceConfig)
    {
        Settings = serviceConfig.Value.Settings;
        MessageStore = serviceConfig.Value.MessageStore;
    }
    public Settings Settings { get; }
    public IMessageStore MessageStore { get; }
    public MailMergeSender Sender => new MailMergeSender { Config = Settings.SenderConfig };
    public MailMergeMessage CreateDefaultMessage()
    {
        return new MailMergeMessage {Config = Settings.MessageConfig, PlainText = string.Empty, HtmlText = string.Empty, Subject = string.Empty};
    }
}

Step 3: Create the service class implementing the interface from step 1:

public class MailMergeServiceConfig
{
    public Settings Settings { get; set; }
    public IMessageStore MessageStore { get; set; }
}

Step 4: Add an extension method for adding MailMerge services to the DI container

public static class MailMergeServiceCollectionExtensions
{
    public static IServiceCollection AddMailMergeService(this IServiceCollection services, Action<MailMergeServiceConfig> config)
    {
        if (services == null)
            throw new ArgumentNullException(nameof(services));
        if (config == null)
            throw new ArgumentNullException(nameof(config));
        services.Configure<MailMergeServiceConfig>(config);
        services.AddTransient<IMailMergeService, MailMergeService>();
        return services;
    }
}

Step 5: Add the MergeMergeService and configure to fit your needs:

services.AddMailMergeService(
    options =>
    {
        options.Settings = Settings.Deserialize(
            Path.Combine(_hostingEnvironment.ContentRootPath, ConfigurationFolder,
                $@"MailMergeLib.{_hostingEnvironment.EnvironmentName}.config"),
            Encoding.UTF8);
        var fms = FileMessageStore.Deserialize(Path.Combine(_hostingEnvironment.ContentRootPath, ConfigurationFolder,
            "MailMergeLibMessageStore.config"), Encoding.UTF8);
        for (var i = 0; i < fms.SearchFolders.Length; i++)
        {
            // make relative paths absolute - ready to use
            fms.SearchFolders[i] = Path.Combine(_hostingEnvironment.WebRootPath, fms.SearchFolders[i]);
        }
        options.MessageStore = fms;
    });

Step 6: Create an MVC Controller with the following ctor:

public class SomeController : ControllerBase
{
    private readonly IMailMergeService _mailMergeService;

    public SomeController(IMailMergeService mailMergeService)
    {
        _mailMergeService = mailMergeService;
    }
}

Step 7: Use the MailMergeService e.g. like this:

public async Task<ViewResult> SendMail()
{
    var recipients = new[]
    {
        new { Email = "sample@example.com", Name = "John Specimen" },
        new { Email = "mary@example.com",   Name = "Mary Specimen" }
    };

    // load the mail template from the configures MessageStore
    var mailMergeMessage = _mailMergeService.MessageStore.ScanForMessages().First(m => m.Id == 1).LoadMessage();
    
    // send the mails
    await _mailMergeService.Sender.SendAsync(mailMergeMessage, recipients);

    return View("SendMail", recipients);
}