如何注册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可以使用其默认构造函数,也统一可以创建新的实例,每次
Unity容器尝试创建SmtpEmail
类对象。它有3个构造函数,unity选择参数最多的一个:
public SmtpClient(
string host,
int port
)
所以,你需要指定选择不带参数的构造函数:
var container = new UnityContainer();
container.RegisterType<SmtpClient>(new InjectionConstructor());
container.RegisterType<IEmail, SmtpEmail>();