C# 如何注入ILogger<;T>;对ConfigureServices-.net core 2.0中服务的依赖关系

C# 如何注入ILogger<;T>;对ConfigureServices-.net core 2.0中服务的依赖关系,c#,dependency-injection,asp.net-core-2.0,.net-core-logging,C#,Dependency Injection,Asp.net Core 2.0,.net Core Logging,我有以下邮件服务: public class MailService : IMailService { private readonly ILogger<MailService> _logger; private readonly SmtpClient _client; public MailService(ILogger<MailService> logger, SmtpClient client) { _logger

我有以下
邮件服务

public class MailService : IMailService
{
    private readonly ILogger<MailService> _logger;
    private readonly SmtpClient _client;

    public MailService(ILogger<MailService> logger, SmtpClient client)
    {
        _logger = logger;
        _client = client;
    }

    public async Task Send(string to, string subject, string body)
    {
        var message = new MailMessage
        {
            Subject = subject,
            Body = body,
            IsBodyHtml = true,
            From = new MailAddress("info@domain.com")
        };

        message.To.Add(to);

        using (_client)
        {
            _logger.LogTrace($"Sending email from {message.From.Address} to {to}. Subject: {subject}");
            await _client.SendMailAsync(message);
        }
    }

}
有没有办法抓取一个logger实例并将其提供给邮件服务?

这不管用吗

services.AddTransient<IMailService>(provider =>

        {
            return new MailService(provider.GetRequiredService<ILogger<MailService>>(), new SmtpClient());
        });
services.AddTransient(提供者=>
{
返回新的邮件服务(provider.GetRequiredService(),new SmtpClient());
});
这不管用吗

services.AddTransient<IMailService>(provider =>

        {
            return new MailService(provider.GetRequiredService<ILogger<MailService>>(), new SmtpClient());
        });
services.AddTransient(提供者=>
{
返回新的邮件服务(provider.GetRequiredService(),new SmtpClient());
});
我想使用实现工厂创建此服务 因为我将从配置和供应中读取smtp设置 smtp客户端

您不应该使用实现工厂添加
IMailService
,最好使用实现工厂添加
SmtpClient

services.AddTransient<IMailService, MailService>();
services.AddTransient(_ => new SmtpClient("127.0.0.1", 25));
services.AddTransient();
AddTransient(=>新的SmtpClient(“127.0.0.1”,25));
我想使用实现工厂创建此服务 因为我将从配置和供应中读取smtp设置 smtp客户端

您不应该使用实现工厂添加
IMailService
,最好使用实现工厂添加
SmtpClient

services.AddTransient<IMailService, MailService>();
services.AddTransient(_ => new SmtpClient("127.0.0.1", 25));
services.AddTransient();
AddTransient(=>新的SmtpClient(“127.0.0.1”,25));

这一点很好。但是,我刚刚在邮件服务的构造函数中添加了一个from参数(从配置中读取该参数),除非有一种方法可以从smtp客户端读取用户名并将其用于from值,否则此参数将无法用您的方法解析。好的,我明白您的意思。我现在将smtp客户端单独注册为服务,并在注册时向邮件服务提供发件人地址。这一点很好。但是,我刚刚在邮件服务的构造函数中添加了一个from参数(从配置中读取该参数),除非有一种方法可以从smtp客户端读取用户名并将其用于from值,否则此参数将无法用您的方法解析。好的,我明白您的意思。我现在将smtp客户端单独注册为服务,并在注册时向邮件服务提供发件人地址。