diff --git a/GFramework.Core.Abstractions/GFramework.Core.Abstractions.csproj b/GFramework.Core.Abstractions/GFramework.Core.Abstractions.csproj
index 3f08ecf..3068015 100644
--- a/GFramework.Core.Abstractions/GFramework.Core.Abstractions.csproj
+++ b/GFramework.Core.Abstractions/GFramework.Core.Abstractions.csproj
@@ -25,5 +25,6 @@
all
runtime; build; native; contentfiles; analyzers
+
diff --git a/GFramework.Core.Abstractions/ioc/IIocContainer.cs b/GFramework.Core.Abstractions/ioc/IIocContainer.cs
index 6d8cba4..06c1538 100644
--- a/GFramework.Core.Abstractions/ioc/IIocContainer.cs
+++ b/GFramework.Core.Abstractions/ioc/IIocContainer.cs
@@ -1,5 +1,6 @@
using GFramework.Core.Abstractions.rule;
using GFramework.Core.Abstractions.system;
+using Microsoft.Extensions.DependencyInjection;
namespace GFramework.Core.Abstractions.ioc;
@@ -19,6 +20,14 @@ public interface IIocContainer : IContextAware
/// 当该类型已经注册过单例时抛出异常
void RegisterSingleton(T instance);
+ ///
+ /// 注册单例服务,指定服务类型和实现类型
+ /// 创建单例实例并在容器中注册
+ ///
+ /// 服务接口或基类类型
+ /// 具体的实现类型
+ void RegisterSingleton()
+ where TImpl : class, TService where TService : class;
///
/// 注册多个实例
@@ -47,6 +56,14 @@ public interface IIocContainer : IContextAware
/// 要注册的实例对象
void Register(Type type, object instance);
+ ///
+ /// 注册工厂方法来创建服务实例
+ /// 通过委托函数动态创建服务实例
+ ///
+ /// 服务类型
+ /// 创建服务实例的工厂委托函数
+ void RegisterFactory(Func factory);
+
#endregion
#region Get Methods
@@ -117,7 +134,7 @@ public interface IIocContainer : IContextAware
///
/// 要检查的类型
/// 如果容器中包含指定类型的实例则返回true,否则返回false
- bool Contains();
+ bool Contains() where T : class;
///
/// 判断容器中是否包含某个具体的实例对象
@@ -133,8 +150,16 @@ public interface IIocContainer : IContextAware
///
/// 冻结容器,防止后续修改
+ /// 调用此方法后,容器将变为只读状态,不能再注册新的服务实例
///
void Freeze();
+ ///
+ /// 获取底层的服务集合
+ /// 提供对内部IServiceCollection的访问权限,用于高级配置和自定义操作
+ ///
+ /// 底层的IServiceCollection实例
+ IServiceCollection Services { get; }
+
#endregion
}
\ No newline at end of file
diff --git a/GFramework.Core.Tests/architecture/ArchitectureContextTests.cs b/GFramework.Core.Tests/architecture/ArchitectureContextTests.cs
index 059c5ac..e00fd86 100644
--- a/GFramework.Core.Tests/architecture/ArchitectureContextTests.cs
+++ b/GFramework.Core.Tests/architecture/ArchitectureContextTests.cs
@@ -46,13 +46,13 @@ public class ArchitectureContextTests
[SetUp]
public void SetUp()
{
- // 初始化 LoggerFactoryResolver 以支持 IocContainer
+ // 初始化 LoggerFactoryResolver 以支持 MicrosoftDiContainer
LoggerFactoryResolver.Provider = new ConsoleLoggerFactoryProvider();
- _container = new IocContainer();
+ _container = new MicrosoftDiContainer();
// 直接初始化 logger 字段
- var loggerField = typeof(IocContainer).GetField("_logger",
+ var loggerField = typeof(MicrosoftDiContainer).GetField("_logger",
BindingFlags.NonPublic | BindingFlags.Instance);
loggerField?.SetValue(_container,
LoggerFactoryResolver.Provider.CreateLogger(nameof(ArchitectureContextTests)));
@@ -75,7 +75,7 @@ public class ArchitectureContextTests
}
private ArchitectureContext? _context;
- private IocContainer? _container;
+ private MicrosoftDiContainer? _container;
private EventBus? _eventBus;
private CommandExecutor? _commandBus;
private QueryExecutor? _queryBus;
diff --git a/GFramework.Core.Tests/architecture/ArchitectureServicesTests.cs b/GFramework.Core.Tests/architecture/ArchitectureServicesTests.cs
index 9cf748f..7c1d2ac 100644
--- a/GFramework.Core.Tests/architecture/ArchitectureServicesTests.cs
+++ b/GFramework.Core.Tests/architecture/ArchitectureServicesTests.cs
@@ -59,7 +59,7 @@ public class ArchitectureServicesTests
public void Container_Should_Be_Instance_Of_IocContainer()
{
Assert.That(_services!.Container, Is.InstanceOf());
- Assert.That(_services.Container, Is.InstanceOf());
+ Assert.That(_services.Container, Is.InstanceOf());
}
///
@@ -218,7 +218,7 @@ public class ArchitectureServicesTests
public class TestArchitectureContextV3 : IArchitectureContext
{
- private readonly IocContainer _container = new();
+ private readonly MicrosoftDiContainer _container = new();
private readonly DefaultEnvironment _environment = new();
public int Id { get; init; }
diff --git a/GFramework.Core.Tests/architecture/GameContextTests.cs b/GFramework.Core.Tests/architecture/GameContextTests.cs
index 9bd4ef8..054b70b 100644
--- a/GFramework.Core.Tests/architecture/GameContextTests.cs
+++ b/GFramework.Core.Tests/architecture/GameContextTests.cs
@@ -229,7 +229,7 @@ public class TestArchitecture : Architecture
///
public class TestArchitectureContext : IArchitectureContext
{
- private readonly IocContainer _container = new();
+ private readonly MicrosoftDiContainer _container = new();
///
/// 获取依赖注入容器
diff --git a/GFramework.Core.Tests/command/AbstractAsyncCommandTests.cs b/GFramework.Core.Tests/command/AbstractAsyncCommandTests.cs
index c9863dc..6f445f1 100644
--- a/GFramework.Core.Tests/command/AbstractAsyncCommandTests.cs
+++ b/GFramework.Core.Tests/command/AbstractAsyncCommandTests.cs
@@ -32,7 +32,7 @@ public class AbstractAsyncCommandTests
[SetUp]
public void SetUp()
{
- _container = new IocContainer();
+ _container = new MicrosoftDiContainer();
_container.RegisterPlurality(new EventBus());
_container.RegisterPlurality(new CommandExecutor());
_container.RegisterPlurality(new QueryExecutor());
@@ -42,7 +42,7 @@ public class AbstractAsyncCommandTests
}
private ArchitectureContext _context = null!;
- private IocContainer _container = null!;
+ private MicrosoftDiContainer _container = null!;
///
/// 测试异步命令无返回值版本的基础实现
diff --git a/GFramework.Core.Tests/ioc/IocContainerTests.cs b/GFramework.Core.Tests/ioc/MicrosoftDiContainerTests.cs
similarity index 96%
rename from GFramework.Core.Tests/ioc/IocContainerTests.cs
rename to GFramework.Core.Tests/ioc/MicrosoftDiContainerTests.cs
index 7f3d785..6c9c10a 100644
--- a/GFramework.Core.Tests/ioc/IocContainerTests.cs
+++ b/GFramework.Core.Tests/ioc/MicrosoftDiContainerTests.cs
@@ -10,7 +10,7 @@ namespace GFramework.Core.Tests.ioc;
/// 测试 IoC 容器功能的单元测试类
///
[TestFixture]
-public class IocContainerTests
+public class MicrosoftDiContainerTests
{
///
/// 在每个测试方法执行前进行设置
@@ -18,18 +18,18 @@ public class IocContainerTests
[SetUp]
public void SetUp()
{
- // 初始化 LoggerFactoryResolver 以支持 IocContainer
+ // 初始化 LoggerFactoryResolver 以支持 MicrosoftDiContainer
LoggerFactoryResolver.Provider = new ConsoleLoggerFactoryProvider();
- _container = new IocContainer();
+ _container = new MicrosoftDiContainer();
// 直接初始化 logger 字段
- var loggerField = typeof(IocContainer).GetField("_logger",
+ var loggerField = typeof(MicrosoftDiContainer).GetField("_logger",
BindingFlags.NonPublic | BindingFlags.Instance);
loggerField?.SetValue(_container,
- LoggerFactoryResolver.Provider.CreateLogger(nameof(IocContainer)));
+ LoggerFactoryResolver.Provider.CreateLogger(nameof(MicrosoftDiContainer)));
}
- private IocContainer _container = null!;
+ private MicrosoftDiContainer _container = null!;
private readonly Dictionary _mockContextServices = new();
///
diff --git a/GFramework.Core.Tests/query/AbstractAsyncQueryTests.cs b/GFramework.Core.Tests/query/AbstractAsyncQueryTests.cs
index c908973..0019970 100644
--- a/GFramework.Core.Tests/query/AbstractAsyncQueryTests.cs
+++ b/GFramework.Core.Tests/query/AbstractAsyncQueryTests.cs
@@ -30,7 +30,7 @@ public class AbstractAsyncQueryTests
[SetUp]
public void SetUp()
{
- _container = new IocContainer();
+ _container = new MicrosoftDiContainer();
_container.RegisterPlurality(new EventBus());
_container.RegisterPlurality(new CommandExecutor());
_container.RegisterPlurality(new QueryExecutor());
@@ -40,7 +40,7 @@ public class AbstractAsyncQueryTests
}
private ArchitectureContext _context = null!;
- private IocContainer _container = null!;
+ private MicrosoftDiContainer _container = null!;
///
/// 测试异步查询的基础实现
diff --git a/GFramework.Core.Tests/state/StateMachineSystemTests.cs b/GFramework.Core.Tests/state/StateMachineSystemTests.cs
index 632cf6b..b05ddc5 100644
--- a/GFramework.Core.Tests/state/StateMachineSystemTests.cs
+++ b/GFramework.Core.Tests/state/StateMachineSystemTests.cs
@@ -37,14 +37,14 @@ public class StateMachineSystemTests
[SetUp]
public void SetUp()
{
- // 初始化 LoggerFactoryResolver 以支持 IocContainer
+ // 初始化 LoggerFactoryResolver 以支持 MicrosoftDiContainer
LoggerFactoryResolver.Provider = new ConsoleLoggerFactoryProvider();
_eventBus = new EventBus();
- var container = new IocContainer();
+ var container = new MicrosoftDiContainer();
// 直接初始化 logger 字段
- var loggerField = typeof(IocContainer).GetField("_logger",
+ var loggerField = typeof(MicrosoftDiContainer).GetField("_logger",
BindingFlags.NonPublic | BindingFlags.Instance);
loggerField?.SetValue(container,
LoggerFactoryResolver.Provider.CreateLogger(nameof(StateMachineSystemTests)));
diff --git a/GFramework.Core.Tests/utility/AbstractContextUtilityTests.cs b/GFramework.Core.Tests/utility/AbstractContextUtilityTests.cs
index 8339e2c..b970c31 100644
--- a/GFramework.Core.Tests/utility/AbstractContextUtilityTests.cs
+++ b/GFramework.Core.Tests/utility/AbstractContextUtilityTests.cs
@@ -30,7 +30,7 @@ public class AbstractContextUtilityTests
[SetUp]
public void SetUp()
{
- _container = new IocContainer();
+ _container = new MicrosoftDiContainer();
_container.RegisterPlurality(new EventBus());
_container.RegisterPlurality(new CommandExecutor());
_container.RegisterPlurality(new QueryExecutor());
@@ -40,7 +40,7 @@ public class AbstractContextUtilityTests
}
private ArchitectureContext _context = null!;
- private IocContainer _container = null!;
+ private MicrosoftDiContainer _container = null!;
///
/// 测试AbstractContextUtility实现IContextUtility接口
diff --git a/GFramework.Core/GFramework.Core.csproj b/GFramework.Core/GFramework.Core.csproj
index 2775e88..3897ac1 100644
--- a/GFramework.Core/GFramework.Core.csproj
+++ b/GFramework.Core/GFramework.Core.csproj
@@ -12,5 +12,11 @@
+
+
+ all
+ runtime; build; native; contentfiles; analyzers; buildtransitive
+
+
diff --git a/GFramework.Core/architecture/Architecture.cs b/GFramework.Core/architecture/Architecture.cs
index e045b81..d5902ca 100644
--- a/GFramework.Core/architecture/Architecture.cs
+++ b/GFramework.Core/architecture/Architecture.cs
@@ -10,6 +10,7 @@ using GFramework.Core.Abstractions.utility;
using GFramework.Core.environment;
using GFramework.Core.extensions;
using GFramework.Core.logging;
+using Microsoft.Extensions.DependencyInjection;
using IDisposable = GFramework.Core.Abstractions.lifecycle.IDisposable;
namespace GFramework.Core.architecture;
@@ -540,6 +541,9 @@ public abstract class Architecture(
// 为服务设置上下文
Services.SetContext(_context);
+ // 添加 Mediator
+ Container.Services.AddMediator();
+
// === 用户 Init ===
_logger.Debug("Calling user Init()");
Init();
diff --git a/GFramework.Core/architecture/ArchitectureServices.cs b/GFramework.Core/architecture/ArchitectureServices.cs
index bf5d197..bd6656a 100644
--- a/GFramework.Core/architecture/ArchitectureServices.cs
+++ b/GFramework.Core/architecture/ArchitectureServices.cs
@@ -47,7 +47,7 @@ public class ArchitectureServices : IArchitectureServices
///
public ArchitectureServices()
{
- Container = new IocContainer();
+ Container = new MicrosoftDiContainer();
// 创建服务实例
_eventBus = new EventBus();
diff --git a/GFramework.Core/ioc/IocContainer.cs b/GFramework.Core/ioc/IocContainer.cs
deleted file mode 100644
index 5f4bf9d..0000000
--- a/GFramework.Core/ioc/IocContainer.cs
+++ /dev/null
@@ -1,452 +0,0 @@
-using GFramework.Core.Abstractions.ioc;
-using GFramework.Core.Abstractions.logging;
-using GFramework.Core.Abstractions.system;
-using GFramework.Core.logging;
-using GFramework.Core.rule;
-
-namespace GFramework.Core.ioc;
-
-///
-/// IOC容器类,用于管理对象的注册和获取
-///
-public class IocContainer : ContextAwareBase, IIocContainer
-{
- #region Lock
-
- ///
- /// 读写锁对象,用于控制多线程环境下对共享资源的访问
- /// 使用ReaderWriterLockSlim提供高效的读写锁定机制
- /// 配置为不支持递归锁,避免死锁风险
- ///
- private readonly ReaderWriterLockSlim _lock = new(LockRecursionPolicy.NoRecursion);
-
- #endregion
-
- #region Flag
-
- ///
- /// 冻结标志位,用于标识对象是否已被冻结
- /// true表示对象已冻结,不可修改;false表示对象可正常修改
- ///
- private volatile bool _frozen;
-
- #endregion
-
- #region Core
-
- ///
- /// 存储所有已注册对象实例的集合,用于跟踪和管理容器中的所有对象
- /// 使用HashSet确保对象唯一性,避免重复注册同一实例
- ///
- private readonly HashSet