Refactor products and buildings to support modding
This commit is contained in:
116
backend/src/MyBiz.Core/ProductRegistry.cs
Normal file
116
backend/src/MyBiz.Core/ProductRegistry.cs
Normal file
@@ -0,0 +1,116 @@
|
||||
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 "{}";
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user