A:添加新模块

This commit is contained in:
jimmy committed 2025-11-13 18:30:02 +08:00
1 parent 43ff9bc57f
commit 25c4a663a5
9 files changed
+418 -15

No files matched your search

-7
View File
@@ -1,7 +0,0 @@
namespace Common
{
public class Class1
{
}
}
+338
View File
@@ -0,0 +1,338 @@
namespace Common;
/// <summary>
/// Global 轻量级 DI 容器使用示例
/// </summary>
public static class GlobalUsageExamples
{
/// <summary>
/// 基础使用示例
/// </summary>
public static void BasicUsageExamples()
{
// 1. 注册和获取单例服务
var config = new AppConfig { AppName = "MyApp", Version = "1.0" };
Global.RegisterSingleton(config);
var retrievedConfig = Global.Get<AppConfig>();
Console.WriteLine($"App: {retrievedConfig.AppName} v{retrievedConfig.Version}");
// 2. 使用工厂方法注册单例
Global.RegisterSingleton(() => new DatabaseConnection("connection-string"));
var db = Global.Get<DatabaseConnection>();
// 3. 注册瞬态服务(每次获取都是新实例)
Global.RegisterTransient(() => new RequestContext
{
RequestId = Guid.NewGuid().ToString(),
Timestamp = DateTime.Now
});
var request1 = Global.Get<RequestContext>();
var request2 = Global.Get<RequestContext>();
// request1 和 request2 是不同的实例
// 4. 尝试获取服务
if (Global.TryGet<ILogger>(out var logger))
{
logger.Log("Service found");
}
else
{
Console.WriteLine("Logger not registered");
}
// 5. 获取服务或默认值
var fallbackLogger = Global.GetOrDefault<ILogger>(new ConsoleLogger());
// 6. 检查服务是否注册
if (Global.IsRegistered<AppConfig>())
{
Console.WriteLine("AppConfig is registered");
}
}
/// <summary>
/// 服务变更通知示例
/// </summary>
public static void ChangeNotificationExamples()
{
// 1. 订阅服务变更通知
Global.Subscribe<AppConfig>(eventArgs =>
{
Console.WriteLine($"Config changed at {eventArgs.ChangedAt}");
Console.WriteLine($"Old: {eventArgs.OldValue?.AppName ?? "null"}");
Console.WriteLine($"New: {eventArgs.NewValue.AppName}");
});
// 2. 注册初始配置
var config = new AppConfig { AppName = "MyApp", Version = "1.0" };
Global.RegisterSingleton(config);
// 3. 更新配置(会触发通知)
var newConfig = new AppConfig { AppName = "MyApp", Version = "2.0" };
Global.Update(newConfig);
// 4. 也可以在注册时就设置为通知模式
var anotherConfig = new AppConfig { AppName = "MyApp", Version = "3.0" };
Global.RegisterSingleton(anotherConfig, notifyIfExists: true); // 会触发通知
}
/// <summary>
/// 实时配置更新示例
/// </summary>
public static void LiveConfigurationExample()
{
// 场景:应用程序配置可以动态更新,所有组件都能收到通知
// 1. 定义配置变更处理器
void OnConfigChanged(ServiceChangedEventArgs<AppConfig> e)
{
Console.WriteLine($"[{DateTime.Now:HH:mm:ss}] Configuration updated:");
Console.WriteLine($" Old Version: {e.OldValue?.Version}");
Console.WriteLine($" New Version: {e.NewValue.Version}");
// 在这里可以执行配置变更后的操作
// 例如:重新连接数据库、刷新缓存等
}
// 2. 订阅配置变更
Global.Subscribe<AppConfig>(OnConfigChanged);
// 3. 注册初始配置
Global.RegisterSingleton(new AppConfig { AppName = "MyApp", Version = "1.0" });
// 4. 模拟配置文件被修改,更新配置
Thread.Sleep(1000);
Global.Update(new AppConfig { AppName = "MyApp", Version = "1.1" });
Thread.Sleep(1000);
Global.Update(new AppConfig { AppName = "MyApp", Version = "1.2" });
// 5. 取消订阅
Global.Unsubscribe<AppConfig>(OnConfigChanged);
}
/// <summary>
/// 多订阅者示例
/// </summary>
public static void MultipleSubscribersExample()
{
// 场景:多个组件都关心某个服务的变更
// 订阅者 1:UI 组件
Global.Subscribe<UserSession>(e =>
{
Console.WriteLine($"[UI] User session updated: {e.NewValue.Username}");
// 更新UI显示
});
// 订阅者 2:日志组件
Global.Subscribe<UserSession>(e =>
{
Console.WriteLine($"[LOG] Session change detected at {e.ChangedAt}");
// 记录日志
});
// 订阅者 3:分析组件
Global.Subscribe<UserSession>(e =>
{
Console.WriteLine($"[ANALYTICS] Tracking user: {e.NewValue.Username}");
// 发送分析数据
});
// 注册会话
Global.RegisterSingleton(new UserSession { Username = "user1", LoginTime = DateTime.Now });
// 更新会话(所有订阅者都会收到通知)
Thread.Sleep(100);
Global.Update(new UserSession { Username = "user2", LoginTime = DateTime.Now });
}
/// <summary>
/// 服务生命周期对比示例
/// </summary>
public static void LifetimeComparisonExample()
{
// 1. 单例服务:整个应用生命周期内只有一个实例
Global.RegisterSingleton(() => new CacheService());
var cache1 = Global.Get<CacheService>();
var cache2 = Global.Get<CacheService>();
Console.WriteLine($"Singleton: {ReferenceEquals(cache1, cache2)}"); // True
// 2. 瞬态服务:每次获取都是新实例
Global.RegisterTransient(() => new OperationContext());
var ctx1 = Global.Get<OperationContext>();
var ctx2 = Global.Get<OperationContext>();
Console.WriteLine($"Transient: {ReferenceEquals(ctx1, ctx2)}"); // False
}
/// <summary>
/// 服务管理示例
/// </summary>
public static void ServiceManagementExample()
{
// 注册多个服务
Global.RegisterSingleton(new AppConfig { AppName = "MyApp" });
Global.RegisterSingleton(() => new DatabaseConnection("conn-string"));
Global.RegisterTransient(() => new RequestContext());
// 查看已注册服务数量
Console.WriteLine($"Total services: {Global.Count}");
// 注销特定服务
if (Global.Unregister<RequestContext>())
{
Console.WriteLine("RequestContext unregistered");
}
// 清除所有服务
Global.Clear();
Console.WriteLine($"Services after clear: {Global.Count}");
}
/// <summary>
/// 错误处理示例
/// </summary>
public static void ErrorHandlingExample()
{
try
{
// 尝试获取未注册的服务
var service = Global.Get<ILogger>();
}
catch (InvalidOperationException ex)
{
Console.WriteLine($"Error: {ex.Message}");
}
try
{
// 尝试更新瞬态服务
Global.RegisterTransient(() => new RequestContext());
Global.Update(new RequestContext()); // 会抛出异常
}
catch (InvalidOperationException ex)
{
Console.WriteLine($"Error: {ex.Message}");
}
// 安全的获取方式
if (Global.TryGet<ILogger>(out var logger))
{
logger.Log("Success");
}
else
{
Console.WriteLine("Logger not available, using fallback");
}
}
/// <summary>
/// 工厂模式集成示例
/// </summary>
public static void FactoryPatternExample()
{
// 使用工厂方法创建复杂对象
Global.RegisterSingleton(() =>
{
var config = LoadConfigFromFile();
ValidateConfig(config);
return config;
});
// 延迟初始化:只有在第一次 Get 时才会调用工厂方法
var config = Global.Get<AppConfig>(); // 此时才执行工厂方法
// 后续获取都返回同一个实例
var sameConfig = Global.Get<AppConfig>(); // 直接返回,不再调用工厂
}
/// <summary>
/// 线程安全示例
/// </summary>
public static void ThreadSafetyExample()
{
// 注册服务
Global.RegisterSingleton(() =>
{
Thread.Sleep(100); // 模拟复杂的初始化过程
return new CacheService();
});
// 多线程并发获取(保证只创建一次)
var tasks = Enumerable.Range(0, 10).Select(i =>
Task.Run(() =>
{
var service = Global.Get<CacheService>();
Console.WriteLine($"Thread {i}: {service.GetHashCode()}");
})
);
Task.WaitAll(tasks.ToArray());
// 所有线程获取的都是同一个实例
}
#region 辅助类型
private class AppConfig
{
public string AppName { get; set; } = "";
public string Version { get; set; } = "";
}
private class DatabaseConnection
{
public string ConnectionString { get; }
public DatabaseConnection(string connectionString)
{
ConnectionString = connectionString;
}
}
private class RequestContext
{
public string RequestId { get; set; } = Guid.NewGuid().ToString();
public DateTime Timestamp { get; set; } = DateTime.Now;
}
private interface ILogger
{
void Log(string message);
}
private class ConsoleLogger : ILogger
{
public void Log(string message) => Console.WriteLine($"[LOG] {message}");
}
private class UserSession
{
public string Username { get; set; } = "";
public DateTime LoginTime { get; set; }
}
private class CacheService
{
private readonly Dictionary<string, object> _cache = new();
}
private class OperationContext
{
public Guid OperationId { get; } = Guid.NewGuid();
}
private static AppConfig LoadConfigFromFile()
{
// 模拟从文件加载配置
return new AppConfig { AppName = "MyApp", Version = "1.0" };
}
private static void ValidateConfig(AppConfig config)
{
if (string.IsNullOrEmpty(config.AppName))
throw new InvalidOperationException("AppName cannot be empty");
}
#endregion
}
-7
View File
@@ -1,7 +0,0 @@
namespace Config
{
public class Class1
{
}
}
+14 -1
View File
@@ -1,4 +1,4 @@
<Project Sdk="Microsoft.NET.Sdk"> <Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup> <PropertyGroup>
<TargetFramework>net8.0</TargetFramework> <TargetFramework>net8.0</TargetFramework>
@@ -6,4 +6,17 @@
<Nullable>enable</Nullable> <Nullable>enable</Nullable>
</PropertyGroup> </PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Extensions.Configuration" Version="8.0.0" />
<PackageReference Include="Microsoft.Extensions.Configuration.Binder" Version="8.0.1" />
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="8.0.0" />
<PackageReference Include="Microsoft.Extensions.Configuration.Xml" Version="8.0.0" />
<PackageReference Include="Microsoft.Extensions.Configuration.Ini" Version="8.0.0" />
<PackageReference Include="Microsoft.Extensions.FileProviders.Physical" Version="8.0.0" />
<PackageReference Include="Tomlyn" Version="0.16.2" />
<PackageReference Include="Tomlyn.Extensions.Configuration" Version="0.16.2" />
<PackageReference Include="IniParser" Version="2.5.2" />
</ItemGroup>
</Project> </Project>
+9
View File
@@ -0,0 +1,9 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
</Project>
+9
View File
@@ -0,0 +1,9 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
</Project>
+9
View File
@@ -0,0 +1,9 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
</Project>
+9
View File
@@ -0,0 +1,9 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
</Project>
+30
View File
@@ -9,6 +9,16 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Common", "Common\Common.csp
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Config", "Config\Config.csproj", "{37FBE4C9-1658-4953-8D12-71068EE28804}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Config", "Config\Config.csproj", "{37FBE4C9-1658-4953-8D12-71068EE28804}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Common.Test", "..\..\test\Common.Test\Common.Test.csproj", "{E1DEDCA3-85E7-4965-B05A-2965A18E9249}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "EventBus", "EventBus\EventBus.csproj", "{BF56E23F-4B11-4C3F-9654-2D23D92314C7}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Log", "Log\Log.csproj", "{15F92FFF-521A-4F76-9886-1C0B1969D96D}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NetClient", "NetClient\NetClient.csproj", "{C6BD72CA-701F-4983-A62E-2BD834DA10EC}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NetServer", "NetServer\NetServer.csproj", "{8223A4A8-DE17-4E26-A3EB-674E58B9C446}"
EndProject
Global Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU Debug|Any CPU = Debug|Any CPU
@@ -27,6 +37,26 @@ Global
{37FBE4C9-1658-4953-8D12-71068EE28804}.Debug|Any CPU.Build.0 = Debug|Any CPU {37FBE4C9-1658-4953-8D12-71068EE28804}.Debug|Any CPU.Build.0 = Debug|Any CPU
{37FBE4C9-1658-4953-8D12-71068EE28804}.Release|Any CPU.ActiveCfg = Release|Any CPU {37FBE4C9-1658-4953-8D12-71068EE28804}.Release|Any CPU.ActiveCfg = Release|Any CPU
{37FBE4C9-1658-4953-8D12-71068EE28804}.Release|Any CPU.Build.0 = Release|Any CPU {37FBE4C9-1658-4953-8D12-71068EE28804}.Release|Any CPU.Build.0 = Release|Any CPU
{E1DEDCA3-85E7-4965-B05A-2965A18E9249}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{E1DEDCA3-85E7-4965-B05A-2965A18E9249}.Debug|Any CPU.Build.0 = Debug|Any CPU
{E1DEDCA3-85E7-4965-B05A-2965A18E9249}.Release|Any CPU.ActiveCfg = Release|Any CPU
{E1DEDCA3-85E7-4965-B05A-2965A18E9249}.Release|Any CPU.Build.0 = Release|Any CPU
{BF56E23F-4B11-4C3F-9654-2D23D92314C7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{BF56E23F-4B11-4C3F-9654-2D23D92314C7}.Debug|Any CPU.Build.0 = Debug|Any CPU
{BF56E23F-4B11-4C3F-9654-2D23D92314C7}.Release|Any CPU.ActiveCfg = Release|Any CPU
{BF56E23F-4B11-4C3F-9654-2D23D92314C7}.Release|Any CPU.Build.0 = Release|Any CPU
{15F92FFF-521A-4F76-9886-1C0B1969D96D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{15F92FFF-521A-4F76-9886-1C0B1969D96D}.Debug|Any CPU.Build.0 = Debug|Any CPU
{15F92FFF-521A-4F76-9886-1C0B1969D96D}.Release|Any CPU.ActiveCfg = Release|Any CPU
{15F92FFF-521A-4F76-9886-1C0B1969D96D}.Release|Any CPU.Build.0 = Release|Any CPU
{C6BD72CA-701F-4983-A62E-2BD834DA10EC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{C6BD72CA-701F-4983-A62E-2BD834DA10EC}.Debug|Any CPU.Build.0 = Debug|Any CPU
{C6BD72CA-701F-4983-A62E-2BD834DA10EC}.Release|Any CPU.ActiveCfg = Release|Any CPU
{C6BD72CA-701F-4983-A62E-2BD834DA10EC}.Release|Any CPU.Build.0 = Release|Any CPU
{8223A4A8-DE17-4E26-A3EB-674E58B9C446}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{8223A4A8-DE17-4E26-A3EB-674E58B9C446}.Debug|Any CPU.Build.0 = Debug|Any CPU
{8223A4A8-DE17-4E26-A3EB-674E58B9C446}.Release|Any CPU.ActiveCfg = Release|Any CPU
{8223A4A8-DE17-4E26-A3EB-674E58B9C446}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection EndGlobalSection
GlobalSection(SolutionProperties) = preSolution GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE HideSolutionNode = FALSE