using Microsoft.Extensions.DependencyInjection;
using System;
using System.Collections.Generic;
namespace CryptoExchange.Net.Clients
{
///
/// Base crypto client
///
public class CryptoBaseClient : IDisposable
{
private readonly Dictionary _serviceCache = new Dictionary();
///
/// Service provider
///
protected readonly IServiceProvider? _serviceProvider;
///
/// ctor
///
public CryptoBaseClient() { }
///
/// ctor
///
///
public CryptoBaseClient(IServiceProvider serviceProvider)
{
_serviceProvider = serviceProvider;
_serviceCache = new Dictionary();
}
///
/// Try get a client by type for the service collection
///
///
///
public T TryGet(Func createFunc)
{
var type = typeof(T);
if (_serviceCache.TryGetValue(type, out var value))
return (T)value;
if (_serviceProvider == null)
{
// Create with default options
var createResult = createFunc();
_serviceCache.Add(typeof(T), createResult!);
return createResult;
}
var result = _serviceProvider.GetService()
?? throw new InvalidOperationException($"No service was found for {typeof(T).Name}, make sure the exchange is registered in dependency injection with the `services.Add[Exchange]()` method");
_serviceCache.Add(type, result!);
return result;
}
///
/// Dispose
///
public void Dispose()
{
_serviceCache.Clear();
}
}
}