2016-12-13 17 views
0

実際の例を挙げてください。だから今、シングルトンである.NET内のシングルトン内のオブジェクト

Bind<IHttpClientWrapper>() 
       .To<HttpClientWrapper>() 
       .InSingletonScope() 

public class HttpClientWrapper : IHttpClientWrapper 
{ 
    private static readonly ILogger Logger = LogManager.GetCurrentClassLogger(); 
    private readonly IStatsDPublisher _statsDPublisher; 
    private readonly HttpClient _client; 

    public HttpClientWrapper(IStatsDPublisher statsDPublisher, string baseAddress) 
    { 
     _statsDPublisher = statsDPublisher; 
     _client = new HttpClient(); 


     _client.BaseAddress = new Uri(baseAddress); 
     ServicePointManager.FindServicePoint(_client.BaseAddress).ConnectionLeaseTimeout = (int)TimeSpan.FromSeconds(60).TotalMilliseconds; 
    } 

    public async Task PostAsync<T>(string resource, T content) 
    { 
     var stringContent = new StringContent(JsonConvert.SerializeObject(content), Encoding.UTF8,"application/json"); 

     var name = typeof(T); 

     using (var timer = _statsDPublisher.StartTimer($"HttpClient.{name.Name}.Post")) 
     { 
      try 
      { 
       await _client.PostAsync(resource, stringContent).ContinueWith(
        (postTask) => 
        { 
         postTask.Result.EnsureSuccessStatusCode(); 
        }); 

       timer.StatName = $"{timer.StatName}.Success"; 
      } 
      catch (Exception ex) 
      { 
       timer.StatName = $"{timer.StatName}.Failure"; 
       Logger.ExtendedException(ex, "Failed to Post.", new {Url = resource, Content = content}); 
       throw; 
      } 
     } 
    } 

    public async Task PutAsync<T>(string resource, T content) 
    { 
     var stringContent = new StringContent(JsonConvert.SerializeObject(content), Encoding.UTF8, 
      "application/json"); 

     var name = typeof(T); 

     using (var timer = _statsDPublisher.StartTimer($"HttpClient.{name.Name}.Put")) 
     { 
      try 
      { 
       await _client.PutAsync(resource, stringContent).ContinueWith(
        (postTask) => 
        { 
         postTask.Result.EnsureSuccessStatusCode(); 
        }); 

       timer.StatName = $"{timer.StatName}.Success"; 
      } 
      catch (Exception ex) 
      { 
       timer.StatName = $"{timer.StatName}.Failure"; 
       Logger.ExtendedException(ex, "Failed to Put.", new { Url = resource, Content = content }); 
       throw; 
      } 
     } 
    } 

}}

我々は次の操作を行いIoCのでは:ここでは以下のクラスです。私がHttpClientWrapperを呼び出すたびに、HttpClientの同じインスタンスを扱っているのか、新しいHttpClientを作成するたびにいるのではないかと思いますか?私は、あなたがHttpClientの新しいインスタンスを作成するにもかかわらず、あなたがHttpClientWrapperにアクセスする度に、それがSingletonであるにもかかわらず、信じています。あなたがアドバイスしていただけますか?

おかげ

答えて

1

シングルトンは、あなただけのアプリケーション全体でクラスの1つのインスタンスを持っていることを意味します。そのクラスの別のインスタンスを作成することはできません。また、シングルトン内のオブジェクトを操作すると、常に同じインスタンスが返されます。 しかし、シングルトン以外のクラスの新しいインスタンスを作成することはできます。 答えは明らかに「いいえ」です。

希望に役立ちます。

+0

シングルトンは1つのインスタンスを意味します。それは明らかです。つまり、OrderApiClient内のAとBオブジェクトはシングルトンではありませんが、OrderAPiCLientを呼び出すたびに1つのインスタンスがありますが、このクラスの中でAとBの新しいインスタンスを作成します。 –

+0

もっと詳しく話しましょう。あなたのクラス 'OrderApiClient'が作成されるとクラス' A'の新しいインスタンスを作成します。あなたのコードは 'OrderApiClient.A'にアクセスし、' OrderApiClient'のインスタンス生成時に作成されたインスタンスを返します。だから、あなたは常にAの同じインスタンスを持ち、Aはシングルトンではありません。 'OrderApiClient'のような新しいインスタンスをいつでも作成することができます。 –

+0

あなたの返信をありがとう。 –

関連する問題