Files
my-biz/backend/src/MyBiz.Core/ProductRegistry.cs

117 lines
3.9 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
namespace MyBiz.Core;
/// <summary>
/// Реестр типов продуктов - центрлизованное хранилище конфигураций
/// Поддерживает моддинг через загрузку внешних конфигураций
/// </summary>
public class ProductRegistry
{
private readonly Dictionary<string, ProductType> _productTypes = new();
/// <summary>
/// Все зарегистрированные типы продуктов
/// </summary>
public IEnumerable<ProductType> AllProductTypes => _productTypes.Values;
/// <summary>
/// Количество зарегистрированных типов
/// </summary>
public int Count => _productTypes.Count;
/// <summary>
/// Событие: добавлен новый тип продукта (для моддинга)
/// </summary>
public event Action<ProductType>? ProductTypeAdded;
/// <summary>
/// Событие: изменён тип продукта
/// </summary>
public event Action<ProductType>? ProductTypeModified;
/// <summary>
/// Зарегистрировать тип продукта
/// </summary>
public void Register(ProductType productType)
{
if (string.IsNullOrEmpty(productType.Id))
throw new ArgumentException("Product type must have an Id", nameof(productType));
if (_productTypes.ContainsKey(productType.Id))
throw new InvalidOperationException($"Product type '{productType.Id}' is already registered");
_productTypes[productType.Id] = productType;
ProductTypeAdded?.Invoke(productType);
}
/// <summary>
/// Получить тип продукта по ID
/// </summary>
public ProductType? GetById(string id)
{
return _productTypes.TryGetValue(id, out var type) ? type : null;
}
/// <summary>
/// Получить тип продукта или выбросить исключение
/// </summary>
public ProductType GetOrThrow(string id)
{
return GetById(id) ?? throw new KeyNotFoundException($"Product type '{id}' not found");
}
/// <summary>
/// Проверка: существует ли тип продукта
/// </summary>
public bool Exists(string id)
{
return _productTypes.ContainsKey(id);
}
/// <summary>
/// Получить продукты по категории
/// </summary>
public IEnumerable<ProductType> GetByCategory(ProductCategory category)
{
return _productTypes.Values.Where(p => p.Category == category);
}
/// <summary>
/// Получить продукты, доступные в указанном году
/// </summary>
public IEnumerable<ProductType> GetAvailableInYear(int year)
{
return _productTypes.Values.Where(p => p.AvailableFromYear <= year);
}
/// <summary>
/// Удалить тип продукта (для моддинга)
/// </summary>
public bool Remove(string id)
{
if (_productTypes.Remove(id))
{
ProductTypeModified?.Invoke(new ProductType { Id = id });
return true;
}
return false;
}
/// <summary>
/// Загрузить типы продуктов из конфигурации (JSON и т.п.)
/// </summary>
public void LoadFromConfig(string jsonConfig)
{
// TODO: Реализовать загрузку из JSON
// Это позволит модам добавлять свои продукты
}
/// <summary>
/// Экспортировать все типы в JSON (для моддинга)
/// </summary>
public string ExportToJson()
{
// TODO: Реализовать экспорт в JSON
return "{}";
}
}