feat(cordis): 接入上下文组合与模组事务热替换
This commit is contained in:
@@ -0,0 +1,53 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace ShrinkModFramework
|
||||
{
|
||||
public sealed class ShrinkModRegistryManager
|
||||
{
|
||||
private readonly Dictionary<string, object> _registries = new();
|
||||
|
||||
public ShrinkModRegistry<T> GetOrCreateRegistry<T>(string name)
|
||||
{
|
||||
var compositeKey = BuildCompositeKey(typeof(T), name);
|
||||
if (_registries.TryGetValue(compositeKey, out var existing))
|
||||
return (ShrinkModRegistry<T>)existing;
|
||||
|
||||
var registry = new ShrinkModRegistry<T>(name);
|
||||
_registries.Add(compositeKey, registry);
|
||||
return registry;
|
||||
}
|
||||
|
||||
public bool TryGetRegistry<T>(string name, out ShrinkModRegistry<T> registry)
|
||||
{
|
||||
var compositeKey = BuildCompositeKey(typeof(T), name);
|
||||
if (_registries.TryGetValue(compositeKey, out var existing))
|
||||
{
|
||||
registry = (ShrinkModRegistry<T>)existing;
|
||||
return true;
|
||||
}
|
||||
|
||||
registry = null;
|
||||
return false;
|
||||
}
|
||||
|
||||
internal void Clear() => _registries.Clear();
|
||||
|
||||
internal void RemoveOwnedEntries(string ownerModId)
|
||||
{
|
||||
foreach (var registry in _registries.Values)
|
||||
{
|
||||
if (registry is IShrinkOwnedRegistry ownedRegistry)
|
||||
ownedRegistry.RemoveOwnedEntries(ownerModId);
|
||||
}
|
||||
}
|
||||
|
||||
private static string BuildCompositeKey(Type type, string name)
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(name))
|
||||
throw new ArgumentException("注册表名称不能为空。", nameof(name));
|
||||
|
||||
return $"{type.AssemblyQualifiedName}::{name.Trim()}";
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user