This commit is contained in:
陈思海 2026-04-07 15:16:34 +08:00
parent 286a8c0d66
commit 0d8002bf65

View File

@ -107,6 +107,7 @@ namespace AlicizaX
service = raw as T;
return service != null;
}
service = null;
return false;
}
@ -114,7 +115,8 @@ namespace AlicizaX
public T Require<T>() where T : class, IService
{
if (TryGet(out T service)) return service;
throw new InvalidOperationException($"Scope {Name} does not contain service {typeof(T).FullName}.");
Log.Error($"Scope {Name} does not contain service {typeof(T).FullName}.");
return default;
}
public bool HasContract(Type contractType)
@ -182,18 +184,37 @@ namespace AlicizaX
private void AddToLifecycleLists(IService service)
{
if (service is IServiceTickable tickable) { _tickables.Add(tickable); _tickablesDirty = true; }
if (service is IServiceLateTickable late) { _lateTickables.Add(late); _lateTickablesDirty = true; }
if (service is IServiceFixedTickable fixed_) { _fixedTickables.Add(fixed_); _fixedTickablesDirty = true; }
if (service is IServiceGizmoDrawable gizmo) { _gizmoDrawables.Add(gizmo); _gizmoDrawablesDirty = true; }
if (service is IServiceTickable tickable)
{
_tickables.Add(tickable);
_tickablesDirty = true;
}
if (service is IServiceLateTickable late)
{
_lateTickables.Add(late);
_lateTickablesDirty = true;
}
if (service is IServiceFixedTickable fixed_)
{
_fixedTickables.Add(fixed_);
_fixedTickablesDirty = true;
}
if (service is IServiceGizmoDrawable gizmo)
{
_gizmoDrawables.Add(gizmo);
_gizmoDrawablesDirty = true;
}
}
private void RemoveFromLifecycleLists(IService service)
{
if (service is IServiceTickable tickable && _tickables.Remove(tickable)) _tickablesDirty = true;
if (service is IServiceLateTickable late && _lateTickables.Remove(late)) _lateTickablesDirty = true;
if (service is IServiceFixedTickable fixed_ && _fixedTickables.Remove(fixed_)) _fixedTickablesDirty = true;
if (service is IServiceGizmoDrawable gizmo && _gizmoDrawables.Remove(gizmo)) _gizmoDrawablesDirty = true;
if (service is IServiceTickable tickable && _tickables.Remove(tickable)) _tickablesDirty = true;
if (service is IServiceLateTickable late && _lateTickables.Remove(late)) _lateTickablesDirty = true;
if (service is IServiceFixedTickable fixed_ && _fixedTickables.Remove(fixed_)) _fixedTickablesDirty = true;
if (service is IServiceGizmoDrawable gizmo && _gizmoDrawables.Remove(gizmo)) _gizmoDrawablesDirty = true;
}
private void RemoveBindings(IService service)
@ -203,6 +224,7 @@ namespace AlicizaX
for (var i = 0; i < contracts.Count; i++)
_servicesByContract.Remove(contracts[i]);
}
_contractsByService.Remove(service);
_registrationOrder.Remove(service);
}
@ -215,6 +237,7 @@ namespace AlicizaX
for (var i = 0; i < contracts.Count; i++)
_servicesByContract.Remove(contracts[i]);
}
_contractsByService.Remove(service);
}
@ -226,6 +249,7 @@ namespace AlicizaX
_tickableSnapshot = _tickables.Count > 0 ? _tickables.ToArray() : Array.Empty<IServiceTickable>();
_tickablesDirty = false;
}
return _tickableSnapshot;
}
@ -237,6 +261,7 @@ namespace AlicizaX
_lateTickableSnapshot = _lateTickables.Count > 0 ? _lateTickables.ToArray() : Array.Empty<IServiceLateTickable>();
_lateTickablesDirty = false;
}
return _lateTickableSnapshot;
}
@ -248,6 +273,7 @@ namespace AlicizaX
_fixedTickableSnapshot = _fixedTickables.Count > 0 ? _fixedTickables.ToArray() : Array.Empty<IServiceFixedTickable>();
_fixedTickablesDirty = false;
}
return _fixedTickableSnapshot;
}
@ -259,12 +285,13 @@ namespace AlicizaX
_gizmoSnapshot = _gizmoDrawables.Count > 0 ? _gizmoDrawables.ToArray() : Array.Empty<IServiceGizmoDrawable>();
_gizmoDrawablesDirty = false;
}
return _gizmoSnapshot;
}
private static int CompareByOrder<T>(T a, T b)
{
var left = a is IServiceOrder oa ? oa.Order : 0;
var left = a is IServiceOrder oa ? oa.Order : 0;
var right = b is IServiceOrder ob ? ob.Order : 0;
return left.CompareTo(right);
}