진짜 예를 들어 보자. 다음 클래스는 다음과 같습니다.
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에서 우리는 다음을 수행합니다.
Bind<IHttpClientWrapper>()
.To<HttpClientWrapper>()
.InSingletonScope()
그래서 지금은 싱글 톤입니다. HttpClientWrapper를 호출 할 때마다 HttpClient의 동일한 인스턴스를 처리하는지, 아니면 새 인스턴스를 생성 할 때마다 처리해야합니까? Singleton 임에도 불구하고 HttpClientWrapper에 액세스 할 때마다 HttpClient의 새 인스턴스를 만듭니다. 조언 해 주시겠습니까?
감사
Singleton은 전체 응용 프로그램에 클래스의 단일 인스턴스 만 있음을 의미합니다. 단순히 해당 클래스의 다른 인스턴스를 만들 수 없습니다. 그리고 싱글 톤 내부의 객체로 작업하면 항상 동일한 인스턴스가 반환됩니다. 그러나 싱글 톤 외부에서 다른 클래스의 새 인스턴스를 계속 만들 수 있습니다. 그래서 대답은 분명히 "아니오"입니다.
도움이되기를 바랍니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다