С# 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.
Как я могу это исправить?
Спасибо заранее.
Ответы
Ответ 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>
).