12

クラスに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メッセージ)メソッドで初期化したすべてのプロパティがnullになっています。

どうすればこれを修正できますか?

前もって感謝します。

4

2 に答える 2

22

使い方がLazy<T>間違っています。

使用するときは、実際の型のプロパティを公開し、1 つのインスタンス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);
}
于 2013-02-06T13:50:08.123 に答える
1

ダニエルの答えは正しいです。コードが機能しない理由について説明を追加したいだけです。

にアクセスするたびSmtpClientに、元のコードで新しいLazy<ISmtpClient>オブジェクトが作成され、それが ですぐに初期化されSmtpClient.Valueます。ISmtpClientこれにより、各行に新しいオブジェクトが表示されます。

Lazy<T>Daniels コードのように、オブジェクトを 1 回だけ作成し、それを Property の getter で返す必要があります。プロパティの型は、使用したい型でなければなりません (つまり、Lazy<T>型を消費者に公開しません)。

于 2013-04-05T10:58:45.550 に答える