2016-06-29 55 views
0

我正在使用.Net SmtpClient類來發送電子郵件。 smtp的配置存儲在配置文件中。您可以使用應用程序或機器配置文件爲所有SmtpClient對象指定默認主機,端口和憑據值。默認構造函數將讀取配置文件中的所有值。 MSDN如何使用Unity Container註冊SmtpClient?

<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 \」,name = \「(none)\」。\ r \ n異常 發生while:解析。\ r \ n異常爲: InvalidOperationException - 無法構造String類型。您 必須配置容器以提供此值 值。\ r \ n ---------------------------------- ------------- \ r \ n在例外情況的 時間,容器爲:\ r \ n \ r \ n正在解析 MyFramework.Core.Email.SmtpEmail,(none)(映射從 MyFramework.Core.Email.IEmail,(無))\ r \ n解析參數 「客戶端」的構造函數 MyFramework.Core.Email.SmtpEmail(System.Net.Mail.SmtpClient 客戶端)\ r \ n解決System.Net.Mail.SmtpClient(無)\ r \ n
解析參數\「主機\」的構造函數 System.Net.Mail.SmtpClient(System.String主機,System.Int32端口)\ r \ n 解析System.String,(無)\ r \ n「}

問題
我如何註冊SmtpClient與團結,使SmtpClient可以使用它的默認構造函數,也統一可以創建新實例每次。

回答

-1

Unity容器嘗試創建SmtpEmail類對象。它有3 constructors,統一選擇一個與the most amount of parameters

public SmtpClient(
    string host, 
    int port 
) 

所以,你需要specifify選擇consttructor wiuthout參數:

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

你是對的! – Legends

+0

@ LP13你能接受這個答案,還是我應該添加一些評論? – Backs