Подтвердить что ты не робот

С# Lazy недвижимость

У меня есть свойство Lazy в моем классе:

private Lazy<ISmtpClient> SmtpClient
    {
        get
        {
            return new Lazy<ISmtpClient>(() => _objectCreator.Create<ISmtpClient>(), true);
        }
    }

Также используется метод, который использует эту протуберацию:

public void SendEmail(MailMessage message)
    {
        SmtpClient.Value.ServerName = "testServer";
        SmtpClient.Value.Port = 25;

        SmtpClient.Value.Send(message);
    }

Но в моем SmtpClient, в Send (string message) методе, все протеи, которые я инициализировал в вышеупомянутом методе SendEmail (MailMessage message), null.

Как я могу это исправить?

Спасибо заранее.

4b9b3361

Ответ 1

Вы используете Lazy<T> неправильно.

При использовании Lazy<T> вы обнаружите свойство фактического типа, и у вас есть один экземпляр Lazy<T>. Вы не создаете новый каждый раз при доступе к ресурсу:

Lazy<ISmtpClient> _smtpClient =
    new Lazy<ISmtpClient>(() => _objectCreator.Create<MySmtpClient>(), true);

private ISmtpClient SmtpClient
{
    get
    {
        return _smtpClient.Value;
    }
}

Теперь при первом доступе к свойству SmtpClient создатель объекта создает новый экземпляр MySmtpClient. Это возвращается. При последующих вызовах возвращается тот же экземпляр.

Использование будет выглядеть следующим образом:

public void SendEmail(MailMessage message)
{
    SmtpClient.ServerName = "testServer";
    SmtpClient.Port = 25;

    SmtpClient.Send(message);
}

Ответ 2

Ответ Даниила правильный. Просто хочу добавить пояснения о том, почему ваш код не работает.

Каждый раз, когда вы обращаетесь к SmtpClient, в исходном коде создается новый объект Lazy<ISmtpClient>, который затем инициализируется с помощью SmtpClient.Value. Это дает вам новый объект ISmtpClient для каждой строки.

Вам нужно построить объект Lazy<T> только один раз и вернуть его в Property getter, как в коде Daniels. Тип свойства должен быть типом, который вы хотите использовать (т.е. Вы не предоставляете потребителю тип Lazy<T>).