2013-02-06 8 views
12

Ho un immobile pigro nella mia classe:C# Pigro proprietà

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

Anche un Methode che utilizza questo proptery:

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

     SmtpClient.Value.Send(message); 
    } 

Ma nel mio SmtpClient, in Invia Methode (messaggio stringa) sono tutte le propterie che ho inizializzato nel metodo SendEmail (MailMessage message) sopra, null.

Come posso risolvere questo problema?

Grazie in anticipo.

risposta

22

Si sta utilizzando Lazy<T> errato.

Quando si utilizza Lazy<T> si espone una proprietà del tipo effettivo e si ha un'istanza Lazy<T>. Non si crea uno nuovo ogni volta che la proprietà si accede:

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

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

Ora, per la prima volta la proprietà SmtpClient si accede, il creatore oggetto crea una nuova istanza di MySmtpClient. Questo è restituito. Nelle chiamate successive, viene restituita la stessa istanza.

L'uso sarebbe come questo: risposta

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

    SmtpClient.Send(message); 
} 
+0

Grazie, ma ho fatto pubblicare il codice errato della proprietà pigro, il codice attuale è simile a questo: pigro privato SmtpClient { ottenere { return new pigro (() => _objectCreator.Create (), vero); } } Non è bello? – Djave

+0

@Djave: aggiorna la domanda con il codice reale. –

+0

Ho aggiornato il codice. grazie – Djave

1

di Daniel è corretta. Voglio solo aggiungere un chiarimento sul perché il tuo codice non funziona.

Ogni volta che si accede a SmtpClient, nel codice originale, viene creato un nuovo oggetto Lazy<ISmtpClient>, che viene quindi inizializzato immediatamente con SmtpClient.Value. Questo ti dà un nuovo oggetto ISmtpClient su ogni linea.

È necessario costruire l'oggetto Lazy<T> una sola volta e restituirlo nel getter della proprietà, come nel codice Daniels. Il tipo di proprietà dovrebbe essere il tipo che si desidera utilizzare (ad esempio non si espone un tipo Lazy<T> al consumatore).