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의 새로운 인스턴스를 생성한다고 믿는다. 좀 도와 줄 수있어?
감사
싱글 톤은 하나의 인스턴스를 의미합니다. 그건 분명하다. 따라서 OrderApiClient 내의 A와 B 객체는 싱글 톤이 아니라 OrderAPiCLient를 호출 할 때마다 하나의 인스턴스가 있지만이 클래스 안에는 A와 B의 새 인스턴스가 만들어집니다. –
더 자세히 이야기합시다. 여러분의 클래스'OrderApiClient'가 만들어 질 때'A' 클래스의 새로운 인스턴스를 생성합니다. 여러분의 코드는'OrderApiClient.A'에 인스턴스를 생성 할 때 생성 된 인스턴스를 반환하는 속성을 통해'OrderApiClient.A'에 접근합니다. 그래서 당신은 항상 A의 동일한 인스턴스를 가질 것이고, A는 싱글 톤이 아닙니다. 'OrderApiClient' 나 그 밖의 곳에서는 항상'A'의 새로운 인스턴스를 생성 할 수 있습니다. –
답장을 보내 주셔서 감사합니다. –