Я использую класс .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[] { "[email protected]"};
}
Вот как я регистрируюсь в Unity
var container = new UnityContainer();
container.RegisterType<SmtpClient,SmtpClient>();
container.RegisterType<IEmail, SmtpEmail>();
UnityServiceLocator locator = new UnityServiceLocator(container);
ServiceLocator.SetLocatorProvider(() => locator);
Однако я получаю сообщение об ошибке
{"Не удалось разрешить зависимость, type = \" MyFramework.Core.Email.IEmail \ ", name = \" (none) \ ". \ R \ nИсключение произошло во время: при разрешении. \ R \ nException is: InvalidOperationException - Тип String не может быть создан. Вы должны настроить контейнер для предоставления этого значения. \ R \ n ----------------------------- ------------------ \ r \ nВ момент исключения контейнер был: \ r \ n \ r \ n Разрешение MyFramework.Core.Email.SmtpEmail, ( нет) (сопоставлено из MyFramework.Core.Email.IEmail, (нет)) \ r \ n Параметр разрешения \ "client \" конструктора MyFramework.Core.Email.SmtpEmail (клиент System.Net.Mail.SmtpClient) \ r \ n Разрешение System.Net.Mail.SmtpClient, (нет) \ r \ n
Разрешение параметра \ "host \" конструктора System.Net.Mail.SmtpClient (хост System.String, порт System.Int32) \ r \ n Разрешение System.String, (нет) \ r \ n "}
Вопрос
Как мне зарегистрировать SmtpClient в Unity, чтобы SmtpClient мог использовать свой конструктор по умолчанию, а также Unity мог каждый раз создавать новый экземпляр.