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つのインスタンスを意味します。それは明らかです。つまり、OrderApiClient内のAとBオブジェクトはシングルトンではありませんが、OrderAPiCLientを呼び出すたびに1つのインスタンスがありますが、このクラスの中でAとBの新しいインスタンスを作成します。 –
もっと詳しく話しましょう。あなたのクラス 'OrderApiClient'が作成されるとクラス' A'の新しいインスタンスを作成します。あなたのコードは 'OrderApiClient.A'にアクセスし、' OrderApiClient'のインスタンス生成時に作成されたインスタンスを返します。だから、あなたは常にAの同じインスタンスを持ち、Aはシングルトンではありません。 'OrderApiClient'のような新しいインスタンスをいつでも作成することができます。 –
あなたの返信をありがとう。 –