This commit is contained in:
CortexCore 2024-11-08 21:06:30 +08:00
parent faf72b05e9
commit 5d19061fab
2 changed files with 29 additions and 54 deletions

View File

@ -8,22 +8,6 @@ namespace BITKit.Entities
{
public class Entity : IEntity, IDisposable
{
private class EntityServiceProvider : IServiceProvider
{
public ServiceProvider ServiceProvider;
public readonly List<Object> Services = new();
public object GetService(Type serviceType)
{
var value = ServiceProvider.GetService(serviceType);
if (value != null)
{
Services.TryAdd(value);
}
return value;
}
}
public Entity()
{
ServiceCollection.AddSingleton<IEntity>(this);
@ -36,26 +20,12 @@ namespace BITKit.Entities
public CancellationToken CancellationToken => _cancellationTokenSource.Token;
private readonly CancellationTokenSource _cancellationTokenSource = new();
public IServiceProvider ServiceProvider
{
get
{
if (_serviceProvider is not null)
{
return _serviceProvider;
}
var value = new EntityServiceProvider()
{
ServiceProvider = ServiceCollection.BuildServiceProvider()
};
_serviceProvider = value;
return _serviceProvider;
}
}
public IServiceProvider ServiceProvider => _serviceProvider ??= ServiceCollection.BuildServiceProvider();
private ServiceProvider _serviceProvider;
public IServiceCollection ServiceCollection { get; } = new ServiceCollection();
private EntityServiceProvider _serviceProvider;
public object[] GetServices()=> _serviceProvider.Services.ToArray();
public object[] GetServices() => ServiceCollection.ToArray()
.Select(x => _serviceProvider.GetService(x.ServiceType)).ToArray();
public void Inject(object obj)
{
foreach (var fieldInfo in obj.GetType().GetFields(ReflectionHelper.Flags))
@ -70,11 +40,7 @@ namespace BITKit.Entities
public void Dispose()
{
_cancellationTokenSource.Cancel();
_serviceProvider.ServiceProvider.Dispose();
foreach (var x in GetServices().OfType<IDisposable>())
{
x.Dispose();
}
_serviceProvider.Dispose();
}
}
}

View File

@ -29,7 +29,8 @@ namespace BITKit.StateMachine
{
_serviceProvider = new ServiceCollection().BuildServiceProvider();
}
public bool Enabled { get; set; }
public bool Enabled { get; set; } = true;
public T CurrentState { get; set; }
private T _nextState;
public event Action<T, T> OnStateChanging;
@ -54,7 +55,15 @@ namespace BITKit.StateMachine
CurrentState?.OnStateUpdate(deltaTime);
if(_isBusy)return;
using var _ = _isBusy.GetHandle();
if (!_taskQueue.TryDequeue(out var task)) return;
if (!_taskQueue.TryDequeue(out var task))
{
if(Enabled is false)return;
if (CurrentState is not null)
{
await CurrentState.OnStateUpdateAsync(deltaTime);
}
return;
}
await task.task;
if(_cancellationTokenSource.IsCancellationRequested|| Enabled is false)return;
switch (task.state)
@ -64,8 +73,15 @@ namespace BITKit.StateMachine
OnStateRegistered?.Invoke(task.value);
break;
case AsyncState.InEntering:
_nextState.OnStateEntry(_nextState);
OnStateChanged?.Invoke(CurrentState,_nextState);
if (_nextState is not null)
{
_nextState.OnStateEntry(_nextState);
OnStateChanged?.Invoke(CurrentState,_nextState);
}
else
{
OnStateChanged?.Invoke(CurrentState,default);
}
CurrentState = _nextState;
break;
case AsyncState.InExiting:
@ -73,11 +89,7 @@ namespace BITKit.StateMachine
break;
}
if(Enabled is false)return;
if (CurrentState is not null)
{
await CurrentState.OnStateUpdateAsync(deltaTime);
}
}
@ -103,9 +115,7 @@ namespace BITKit.StateMachine
}
nextState = _serviceProvider.GetRequiredService<TState>();
_taskQueue.Enqueue(new(nextState.InitializeAsync(),AsyncState.Initializing,nextState));
TransitionState(nextState);
return nextState;
return TransitionState(nextState);;
}
public T TransitionState(T nextState)
{
@ -120,8 +130,7 @@ namespace BITKit.StateMachine
{
_taskQueue.Enqueue(new(nextState.OnStateEntryAsync(nextState),AsyncState.InEntering,nextState));
}
return nextState;
return _nextState= nextState;
}
public void Dispose()