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