所以我有一个服务,比方说,它是ASPNET Core上的电子邮件服务.
当我将我的服务添加到ASPNET DI容器时,我想在我的IServiceCollection上应用以下模式来设置我的服务.
public interface IEmailService { void SendMail(string recipient,string message); } public void ConfigureServices(IServiceCollection services) { //configures my service services.AddEmailService<MyEmailService>(options => options.UseEmailServer(sender,smtpHost,smtpPort,smtpPassword)); }
我想知道如果可能的话,最好的方法是什么.我确信我需要为IServiceCollection上的.AddEmailService()方法创建扩展方法,但除此之外我不知道从哪里开始或看.
解决方法
这是一个带注释的示例应用程序,可以让您了解不同的事情:
public class Startup { public void ConfigureServices(IServiceCollection services) { // Add the options stuff. This will allow you to inject IOptions<T>. services.AddOptions(); // This will take care of adding and configuring the email service. services.AddEmailService<MyEmailService>(options => { options.Host = "some-host.com"; options.Port = 25; options.Sender = "firstname@lastname.com"; options.Username = "email"; options.Password = "sup4r-secr3t!"; }); } public void Configure(IApplicationBuilder app,ILoggerFactory loggerFactory) { // Make sure we add the console logger. loggerFactory.AddConsole(); app.Use(async (context,next) => { // Retrieve the email service from the services. var emailService = context.RequestServices.GetrequiredService<IEmailService>(); // Send the email await emailService.SendMail("hello@recipient.com","Hello World!"); }); } public static void Main(string[] args) { WebApplication.Run<Startup>(args); } } public interface IEmailService { Task SendMail(string recipient,string message); } public class EmailOptions { public string Sender { get; set; } public string Host { get; set; } public int Port { get; set; } public string Username { get; set; } public string Password { get; set; } } public class MyEmailService : IEmailService { public MyEmailService(IOptions<EmailOptions> options,ILogger<MyEmailService> logger) { Options = options; // This contains the instance we configured. Logger = logger; } private IOptions<EmailOptions> Options { get; } private ILogger<MyEmailService> Logger { get; } public Task SendMail(string recipient,string message) { // Send the email var builder = new StringBuilder(); builder.AppendLine($"Host: {Options.Value.Host}"); builder.AppendLine($"Port: {Options.Value.Port}"); builder.AppendLine($"Username: {Options.Value.Username}"); builder.AppendLine($"Password: {Options.Value.Password}"); builder.AppendLine("---------------------"); builder.AppendLine($"From: {Options.Value.Sender}"); builder.AppendLine($"To: {recipient}"); builder.AppendLine("---------------------"); builder.AppendLine($"Message: {message}"); Logger.LogInformation(builder.ToString()); return Task.FromResult(0); } } public static class ServiceCollectionExtensions { public static IServiceCollection AddEmailService<TEmailService>(this IServiceCollection services,Action<EmailOptions> configure) where TEmailService : class,IEmailService { // Configure the EmailOptions and register it in the service collection,as IOptions<EmailOptions>. services.Configure(configure); // Add the service itself to the collection. return services.AddSingleton<IEmailService,TEmailService>(); } }
这是在控制台中运行的应用程序:
如您所见,应用程序从配置的EmailOptions中提取一些信息,并从传入的参数中获取一些信息.
编辑:这些是必需的包:
"Microsoft.AspNet.Server.Kestrel": "1.0.0-rc1-final","Microsoft.Extensions.OptionsModel": "1.0.0-rc1-final","Microsoft.Extensions.Logging.Console": "1.0.0-rc1-final"