2013-02-06 9 views
12

ich eine faule Eigenschaft in meiner Klasse haben:C# Faule Eigenschaft

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

auch eine Methode, die dieses proptery verwendet:

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

     SmtpClient.Value.Send(message); 
    } 

Aber in meinem SmtpClient, in Senden (string message) Methode sind alle Eigenschaften, die ich in der obigen Methode SendEmail (MailMessage message) initialisiert habe, null.

Wie kann ich das beheben?

Vielen Dank im Voraus.

Antwort

22

Sie verwenden Lazy<T> falsch.

Wenn Sie Lazy<T> verwenden, geben Sie eine Eigenschaft des tatsächlichen Typs frei, und Sie haben eine Lazy<T> Instanz. Sie haben nicht einen neuen jedes Mal, wenn die Eigenschaft zugegriffen schaffen wird:

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

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

nun das erste Mal der SmtpClient Eigenschaft zugegriffen wird, erstellt das Objekt Schöpfer eine neue Instanz von MySmtpClient. Dies wird zurückgegeben. Bei nachfolgenden Aufrufen wird dieselbe Instanz zurückgegeben.

Die Nutzung würde so aussehen:

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

    SmtpClient.Send(message); 
} 
+0

Danke, aber ich habe den falschen Code der faulen Eigenschaft veröffentlichen, der eigentliche Code ist wie folgt: privaten Faule SmtpClient { erhalten { neue zurückkehren Faul (() => _objectCreator.Create (), wahr); } } Ist es immer noch nicht gut? – Djave

+0

@Djave: Bitte aktualisieren Sie Ihre Frage mit dem tatsächlichen Code. –

+0

Ich habe den Code aktualisiert. danke – Djave

1

Daniels Antwort richtig ist. Ich möchte nur eine Erläuterung hinzufügen, warum Ihr Code nicht funktioniert.

Jedes Mal, wenn Sie auf SmtpClient zugreifen, wird in Ihrem ursprünglichen Code ein neues Objekt Lazy<ISmtpClient> erstellt, das dann sofort mit SmtpClient.Value initialisiert wird. Dadurch erhalten Sie in jeder Zeile ein neues Objekt ISmtpClient.

Sie müssen das Lazy<T>-Objekt nur einmal erstellen und das im Getter der Eigenschaft wie in Daniels-Code zurückgeben. Der Typ der Eigenschaft sollte der Typ sein, den Sie verwenden möchten (d. H. Sie geben keinen Lazy<T>-Typ für den Verbraucher an).