asp.net-core – 在执行DI时指定服务选项的干净方法
发布时间:2020-09-21 23:05:13  所属栏目:asp.Net  来源:互联网 
            导读:所以我有一个服务,比方说,它是ASPNET Core上的电子邮件服务. 当我将我的服务添加到ASPNET DI容器时,我想在我的IServiceCollection上应用以下模式来设置我的服务. public interface IEmailService{ void SendMail(string recipient, string message);}public v
                
                
                
            | 
                         所以我有一个服务,比方说,它是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" (编辑:莱芜站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!  | 
                  
相关内容
- asp.net-mvc-2 – 使用’class(或其他保留关键字)作为匿名类
 - webservice的两种调用方式
 - asp.net-mvc – 什么是强类型的视图在ASP.NET MVC
 - asp.net – IIS Express(WebMatrix)打开外部连接
 - 使用SharpZipLib压缩打包多个内存中的文件
 - asp.net-mvc – 如何在asp.net mvc3项目中开始使用openID?
 - asp.net-mvc – ASP.NET MVC获取具有特定配置文件属性的用户
 - asp.net-mvc-3 – MVC3 Html.ActionLink Post
 - asp.net-mvc – 为什么ASP.NET MVC 4与IList for editor不能
 - asp.net – 如何使用JwtSecurityTokenHandler和JWKS端点验证
 
