2013-02-06 2 views
12

У меня есть Ленивый свойство в моем классе:C# Ленивый свойство

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

Также в METHODE, который использует этот proptery:

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

     SmtpClient.Value.Send(message); 
    } 

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

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

Заранее благодарен.

ответ

22

Вы используете 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); 
} 
+0

Спасибо, но я сделал опубликовать неправильный код ленивой собственности, фактический код, как это: частных Ленивый SmtpClient { получить { вернуть новые Ленивый (() => _objectCreator.Create (), правда); } } Разве это не хорошо? – Djave

+0

@Djave: обновите свой вопрос с помощью фактического кода. –

+0

Я обновил код. спасибо – Djave

1

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

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

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

Смежные вопросы