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