-
Notifications
You must be signed in to change notification settings - Fork 32
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 = "[email protected]", Name = "John Specimen" },
new { Email = "[email protected]", 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);
}