Nano Hash - криптовалюты, майнинг, программирование

Как зарегистрировать SmtpClient в Unity Container?

Я использую класс .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 мог каждый раз создавать новый экземпляр.

29.06.2016

Ответы:


1

Контейнер Unity пытается создать SmtpEmail объект класса. Он имеет 3 конструктора, а unity выбирает тот, у которого наибольшее количество параметры:

public SmtpClient(
    string host,
    int port
)

Итак, вам необходимо указать для выбора конструктора без параметров:

var container = new UnityContainer();
container.RegisterType<SmtpClient>(new InjectionConstructor());
container.RegisterType<IEmail, SmtpEmail>();
30.06.2016
  • @ LP13, ты можешь принять этот ответ, или я должен добавить несколько комментариев? 25.02.2017
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..