如何注册SmtpClient统一容器

本文关键字:SmtpClient 何注册 注册 | 更新日期: 2023-09-27 17:53:05

我使用。net SmtpClient类发送电子邮件。smtp的配置保存在配置文件中。您可以使用应用程序或机器配置文件为所有SmtpClient对象指定默认主机、端口和凭据值。默认构造函数将从配置文件中读取所有值。MSDN

    <configuration>
      <system.net>
        <mailSettings>
          <smtp deliveryMethod="network">
            <network
              host="localhost"
              port="25"
              defaultCredentials="true"
            />
          </smtp>
        </mailSettings>
      </system.net>
    </configuration>

这是我的接口和类,使用SmtpClient

    public interface IEmail:IDisposable
    {
         void Send(string[] to)
    }

    public class SmtpEmail : IEmail
    {
        private bool _disposed = false;
        private SmtpClient _client = null;
        public SmtpEmail(SmtpClient client)
        {
            _client = client;
        }
        public void Send(string[] to)
        {
            using (MailMessage message = GetEmailMessage())
            {
                foreach (string email in to)
                {
                    message.To.Add(email);
                }               
                _client.Send(message);               
            }
        }       
        public void Dispose()
        {
            Dispose(true);
            GC.SuppressFinalize(this);
        }
        private void Dispose(bool disposing)
        {
            if (!_disposed)
            {
                if (disposing)
                {
                    if (_client != null)
                    {
                        _client.Dispose();
                        _disposed = true;
                    }
                }
            }
        }
    }

我想处理SmtpClient一旦我们完成发送电子邮件。这里我使用ServiceLocator

调用它
 using(var emailClient = ServiceLocator.Current.GetInstance<IEmail>())
 {
     emailClient.Send(new string[] { "someone@domain.com"};
 }
这是我如何注册Unity
        var container = new UnityContainer();
        container.RegisterType<SmtpClient,SmtpClient>();
        container.RegisterType<IEmail, SmtpEmail>();
        UnityServiceLocator locator = new UnityServiceLocator(container);
        ServiceLocator.SetLocatorProvider(() => locator);

然而,我得到错误

{"依赖项解析失败,类型=MyFramework.Core.Email '"。IEmail'", name = '"(none)'".'r'nException发生时:在解析时。' r ' nException是:类型String不能被构造。你必须配置容器来提供此功能吗价值。' r ' n -----------------------------------------------' r ' nAt异常发生的时间,容器为:'r'n'r'nMyFramework.Core.Email.SmtpEmail,(none)(映射自MyFramework.Core.Email。(none))'r'n解析参数'"client'"的构造函数MyFramework.Core.Email.SmtpEmail (System.Net.Mail.SmtpClient'r'n解析System.Net.Mail.SmtpClient,(none)'r'n
解析构造函数的参数"host"System.Net.Mail.SmtpClient(系统。字符串主机,系统。Int32端口)' r ' nsystem . string,解决(没有)' r ' n"}


问题我如何注册SmtpClient与统一,使SmtpClient可以使用其默认构造函数,也统一可以创建新的实例,每次

如何注册SmtpClient统一容器

Unity容器尝试创建SmtpEmail类对象。它有3个构造函数,unity选择参数最多的一个:

public SmtpClient(
    string host,
    int port
)

所以,你需要指定选择不带参数的构造函数:

var container = new UnityContainer();
container.RegisterType<SmtpClient>(new InjectionConstructor());
container.RegisterType<IEmail, SmtpEmail>();