2016-06-29 4 views
0

電子メールを送信するための.Net SmtpClientクラスを使用しています。 smtpの設定はconfigファイルに保存されています。アプリケーションまたはマシン構成ファイルを使用して、すべてのSmtpClientオブジェクトのデフォルトのホスト、ポート、および資格情報の値を指定できます。デフォルトのコンストラクタは、設定ファイルからすべての値を読み込みます。 MSDNSmtpClientをUnity Containerに登録するには?

<configuration> 
     <system.net> 
     <mailSettings> 
      <smtp deliveryMethod="network"> 
      <network 
       host="localhost" 
       port="25" 
       defaultCredentials="true" 
      /> 
      </smtp> 
     </mailSettings> 
     </system.net> 
    </configuration> 

は、ここで私たちは、電子メールを送信して行われているとすぐにSmtpClientを処分したい

public interface IEmail:IDisposable 
    { 
     void Send(string[] to) 
    } 


    public class SmtpEmail : IEmail 
    { 
     private bool _disposed = false; 
     private SmtpClient _client = null; 

     public SmtpEmail(SmtpClient client) 
     { 
      _client = client; 
     } 
     public void Send(string[] to) 
     { 
      using (MailMessage message = GetEmailMessage()) 
      { 
       foreach (string email in to) 
       { 
        message.To.Add(email); 
       }    

       _client.Send(message);    
      } 
     }  

     public void Dispose() 
     { 
      Dispose(true); 

      GC.SuppressFinalize(this); 
     } 

     private void Dispose(bool disposing) 
     { 
      if (!_disposed) 
      { 
       if (disposing) 
       { 
        if (_client != null) 
        { 
         _client.Dispose(); 
         _disposed = true; 
        } 
       } 
      } 
     } 
    } 

SmtpClient

使っている私のインターフェースとクラスです。ここで私はここでのServiceLocator

using(var emailClient = ServiceLocator.Current.GetInstance<IEmail>()) 
{ 
    emailClient.Send(new string[] { "[email protected]"}; 
} 

を使用してそれを呼んでいるどのように私はエラー

依存の{「解像度を取得していますしかし、私はユニティ

 var container = new UnityContainer(); 

     container.RegisterType<SmtpClient,SmtpClient>(); 
     container.RegisterType<IEmail, SmtpEmail>(); 

     UnityServiceLocator locator = new UnityServiceLocator(container); 
     ServiceLocator.SetLocatorProvider(() => locator); 

に登録しています方法です失敗しました。タイプ= \ "MyFramework.Core.Email.IEmail \"、名前= \ "(なし)\"。 が発生中:解決中。\ r \ n例外: InvalidOperationException - String型を構築できません。 は、この 値を提供するようにコンテナを構成する必要があります。\ r \ n ---------------------------------- ------------- \ r \ n例外の時刻が の場合、コンテナは:\ r \ n \ r \ n解決する MyFramework.Core.Email.SmtpEmail、(なし)(マップされた MyFramework.Core.Email.Imail、(none))\ r \ nコンストラクタのパラメータ \ "クライアント\"の解決 MyFramework.Core.Email.SmtpEmail(System.Net.Mail.SmtpClient クライアント)\ r \ n
コンストラクタのパラメータ "ホスト"を解決します。 System.Net.Mail.SmtpClient(System.String host、System.Int32 port)\ r System.Net.Mail.SmtpClientを解決しました。 \ n 解決するSystem.String、(なし)\ r \ n "}

質問
SmtpClientがデフォルトのコンストラクタを使用することができますし、また、Unityが新しいインスタンスを毎回作成できるように、どのように私はUnityとSmtpClientを登録します。

答えて

-1

Unityコンテナは、SmtpEmailクラスオブジェクトを作成しようとします。それは3 constructorsを持ち、そして団結はthe most amount of parametersとのいずれかを選択:

public SmtpClient(
    string host, 
    int port 
) 

だから、あなたはパラメータwiuthout consttructorを選択するspecififyする必要があります:あなたは正しいです

var container = new UnityContainer(); 
container.RegisterType<SmtpClient>(new InjectionConstructor()); 
container.RegisterType<IEmail, SmtpEmail>(); 
+0

を! – Legends

+0

@ LP13あなたはこの回答を受け入れることができますか、またはいくつかのコメントを追加する必要がありますか? – Backs

関連する問題