diff --git a/GFramework.Core.Abstractions/architecture/IArchitectureServices.cs b/GFramework.Core.Abstractions/architecture/IArchitectureServices.cs index 34c2433..677f244 100644 --- a/GFramework.Core.Abstractions/architecture/IArchitectureServices.cs +++ b/GFramework.Core.Abstractions/architecture/IArchitectureServices.cs @@ -1,12 +1,13 @@ using GFramework.Core.Abstractions.events; using GFramework.Core.Abstractions.ioc; +using GFramework.Core.Abstractions.rule; namespace GFramework.Core.Abstractions.architecture; /// /// 架构服务接口,定义了框架核心架构所需的服务组件 /// -public interface IArchitectureServices +public interface IArchitectureServices : IContextAware { /// /// 获取依赖注入容器 diff --git a/GFramework.Core.Tests/tests/ArchitectureInitializationTests.cs b/GFramework.Core.Tests/tests/ArchitectureInitializationTests.cs index c1e3cc1..bd5f590 100644 --- a/GFramework.Core.Tests/tests/ArchitectureInitializationTests.cs +++ b/GFramework.Core.Tests/tests/ArchitectureInitializationTests.cs @@ -9,39 +9,49 @@ using NUnit.Framework; namespace GFramework.Core.Tests.tests; [TestFixture] +[NonParallelizable] public class ArchitectureInitializationTests { + [SetUp] + public void SetUp() + { + _architecture = new TestArchitecture(); + } + + [TearDown] + public void TearDown() + { + _architecture!.Destroy(); + _architecture = null; + } + + private TestArchitecture? _architecture; + [Test] public void Architecture_Should_Initialize_All_Components_Correctly() { - // Arrange - var architecture = new TestArchitecture(); - // Act - architecture.Initialize(); + _architecture!.Initialize(); - // Assert - Init() 被调用 - Assert.That(architecture.InitCalled, Is.True, "Architecture.Init() should be called"); + // Assert + Assert.That(_architecture.InitCalled, Is.True); - // Assert - Runtime 已创建 - Assert.That(architecture.Runtime, Is.Not.Null, "ArchitectureRuntime should be created"); + Assert.That(_architecture.Runtime, Is.Not.Null); - // Assert - Phase 已进入 Ready var phaseProperty = typeof(Architecture) .GetProperty("CurrentPhase", BindingFlags.Instance | BindingFlags.NonPublic); - var phase = (ArchitecturePhase)phaseProperty!.GetValue(architecture)!; - Assert.That(phase, Is.EqualTo(ArchitecturePhase.Ready), "Architecture should be in Ready phase"); + var phase = (ArchitecturePhase)phaseProperty!.GetValue(_architecture)!; + Assert.That(phase, Is.EqualTo(ArchitecturePhase.Ready)); + + var context = _architecture.Context; - // Assert - Model 初始化 - var context = architecture.Context; var model = context.GetModel(); Assert.That(model, Is.Not.Null); - Assert.That(model.Inited, Is.True, "Model should be initialized"); + Assert.That(model!.Inited, Is.True); - // Assert - System 初始化 var system = context.GetSystem(); Assert.That(system, Is.Not.Null); - Assert.That(system.Inited, Is.True, "System should be initialized"); + Assert.That(system!.Inited, Is.True); } } \ No newline at end of file diff --git a/GFramework.Core/architecture/Architecture.cs b/GFramework.Core/architecture/Architecture.cs index 951f776..f9bc982 100644 --- a/GFramework.Core/architecture/Architecture.cs +++ b/GFramework.Core/architecture/Architecture.cs @@ -250,6 +250,8 @@ public abstract class Architecture( // 创建架构运行时实例 Runtime = new ArchitectureRuntime(_context); ((ArchitectureContext)_context).Runtime = Runtime; + // 设置服务的上下文 + Services.SetContext(_context); // 调用用户实现的初始化 Init(); @@ -301,6 +303,8 @@ public abstract class Architecture( // 创建架构运行时实例 Runtime = new ArchitectureRuntime(_context); ((ArchitectureContext)_context).Runtime = Runtime; + // 设置服务的上下文 + Services.SetContext(_context); // 调用用户实现的初始化 Init(); diff --git a/GFramework.Core/architecture/ArchitectureServices.cs b/GFramework.Core/architecture/ArchitectureServices.cs index d25ec5f..7b29217 100644 --- a/GFramework.Core/architecture/ArchitectureServices.cs +++ b/GFramework.Core/architecture/ArchitectureServices.cs @@ -8,6 +8,18 @@ namespace GFramework.Core.architecture; public class ArchitectureServices : IArchitectureServices { + private IArchitectureContext _context = null!; public IIocContainer Container { get; } = new IocContainer(); public ITypeEventSystem TypeEventSystem { get; } = new TypeEventSystem(); + + public void SetContext(IArchitectureContext context) + { + _context = context; + Container.SetContext(context); + } + + public IArchitectureContext GetContext() + { + return _context; + } } \ No newline at end of file diff --git a/GFramework.Core/events/TypeEventSystem.cs b/GFramework.Core/events/TypeEventSystem.cs index 5893056..3659406 100644 --- a/GFramework.Core/events/TypeEventSystem.cs +++ b/GFramework.Core/events/TypeEventSystem.cs @@ -15,7 +15,9 @@ public class TypeEventSystem : ITypeEventSystem /// 事件类型,必须具有无参构造函数 public void Send() where T : new() { - _mEvents.GetEvent>().Trigger(new T()); + _mEvents + .GetOrAddEvent>() + .Trigger(new T()); } /// @@ -25,7 +27,9 @@ public class TypeEventSystem : ITypeEventSystem /// 事件实例 public void Send(T e) { - _mEvents.GetEvent>().Trigger(e); + _mEvents + .GetOrAddEvent>() + .Trigger(e); } ///