2016-12-13 4 views
0

실제 예를 들자면 다음과 같습니다. 우리는 다음을 수행 IOC의에서.NET의 싱글 톤 안에있는 객체

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; 
      } 
     } 
    } 

} }

:

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

는 이제 싱글 톤 여기에 다음과 같은 클래스입니다. HttpClientWrapper를 호출 할 때마다 HttpClient의 동일한 인스턴스를 처리하는지 아니면 새 인스턴스를 만들 때마다 처리해야한다고 가정해야합니까? 나는 당신이 HttpClientWrapper에 액세스 할 때마다, Singleton 임에도 불구하고 HttpClient의 새로운 인스턴스를 생성한다고 믿는다. 좀 도와 줄 수있어?

감사

답변

1

싱글 당신이 단지 전체 응용 프로그램에서 클래스의 하나 개의 인스턴스가 있음을 의미한다. 해당 클래스의 다른 인스턴스를 만들 수 없습니다. 그리고 싱글 톤 내부의 객체로 작업하면 항상 동일한 인스턴스가 반환됩니다. 그러나 싱글 톤 이외의 다른 클래스의 새 인스턴스를 만들 수는 있습니다. 그래서 대답은 분명히 "아니오"입니다.

희망이 있습니다.

+0

싱글 톤은 하나의 인스턴스를 의미합니다. 그건 분명하다. 따라서 OrderApiClient 내의 A와 B 객체는 싱글 톤이 아니라 OrderAPiCLient를 호출 할 때마다 하나의 인스턴스가 있지만이 클래스 안에는 A와 B의 새 인스턴스가 만들어집니다. –

+0

더 자세히 이야기합시다. 여러분의 클래스'OrderApiClient'가 만들어 질 때'A' 클래스의 새로운 인스턴스를 생성합니다. 여러분의 코드는'OrderApiClient.A'에 인스턴스를 생성 할 때 생성 된 인스턴스를 반환하는 속성을 통해'OrderApiClient.A'에 접근합니다. 그래서 당신은 항상 A의 동일한 인스턴스를 가질 것이고, A는 싱글 톤이 아닙니다. 'OrderApiClient' 나 그 밖의 곳에서는 항상'A'의 새로운 인스턴스를 생성 할 수 있습니다. –

+0

답장을 보내 주셔서 감사합니다. –