【问题标题】:Clean way to specify options for a service when doing DI执行 DI 时指定服务选项的简洁方法
【发布时间】:2016-02-03 13:33:00
【问题描述】:

所以我有一个服务,比如说它是 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() 方法创建一个扩展方法,但是除此之外的任何东西我都不确定从哪里开始或查看。

【问题讨论】:

标签: asp.net-core


【解决方案1】:

这是一个带有 cmets 的示例应用程序,可让您了解不同的事情在做什么:

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"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-08
    • 1970-01-01
    • 2019-04-15
    • 1970-01-01
    • 2020-04-13
    • 2011-07-26
    相关资源
    最近更新 更多