基本修改完毕开始进行单元测试

This commit is contained in:
2025-07-19 14:36:34 +08:00
parent ca67d2e6df
commit aaf8bdf08a
23 changed files with 843 additions and 353 deletions

View File

@@ -113,10 +113,10 @@ public partial class App : System.Windows.Application
services.AddScoped<DMS.Infrastructure.Data.SqlSugarDbContext>();
// Register ITransaction (abstract interface for transaction management)
services.AddScoped<DMS.Core.Interfaces.ITransaction, DMS.Infrastructure.Data.SqlSugarDbContext>();
//services.AddScoped<DMS.Core.Interfaces.ITransaction, DMS.Infrastructure.Data.SqlSugarDbContext>();
// Register IDatabaseService (abstract interface for database initialization)
services.AddSingleton<DMS.Core.Interfaces.IDatabaseService, DMS.Infrastructure.Services.DatabaseInitializerService>();
//// Register IDatabaseService (abstract interface for database initialization)
//services.AddSingleton<DMS.Core.Interfaces.IDatabaseService, DMS.Infrastructure.Services.DatabaseInitializerService>();
services.AddSingleton<DataServices>();
services.AddSingleton<NavgatorServices>();
@@ -125,6 +125,7 @@ public partial class App : System.Windows.Application
services.AddHostedService<S7BackgroundService>();
services.AddHostedService<OpcUaBackgroundService>();
services.AddSingleton<MqttBackgroundService>();
services.AddSingleton<ChannelBusService>();
services.AddHostedService(provider => provider.GetRequiredService<MqttBackgroundService>());
services.AddSingleton<OpcUaBackgroundService>();
@@ -156,7 +157,7 @@ public partial class App : System.Windows.Application
services.AddSingleton<SettingViewModel>();
services.AddSingleton<DataTransformViewModel>();
services.AddSingleton<VariableTableViewModel>();
services.AddScoped<MqttServerDetailViewModel>();
//services.AddScoped<MqttServerDetailViewModel>();
services.AddSingleton<DeviceDetailViewModel>();
services.AddScoped<MqttsViewModel>();
//注册View视图

View File

@@ -0,0 +1,60 @@
using System;
using System.Collections.Concurrent;
using System.Threading;
using System.Threading.Channels;
using System.Threading.Tasks;
namespace DMS.WPF.Services
{
/// <summary>
/// 标记接口用于标识可以通过ChannelBusService发送的消息。
/// </summary>
public interface IChannelMessage { }
/// <summary>
/// 提供基于System.Threading.Channels的消息发布/订阅机制,实现组件解耦。
/// </summary>
public class ChannelBusService
{
// 使用ConcurrentDictionary存储不同消息类型的Channel
private readonly ConcurrentDictionary<Type, object> _channels = new ConcurrentDictionary<Type, object>();
/// <summary>
/// 异步发布一条消息到对应的Channel。
/// </summary>
/// <typeparam name="TMessage">消息的类型必须实现IChannelMessage接口。</typeparam>
/// <param name="message">要发布的消息实例。</param>
/// <param name="cancellationToken">取消令牌。</param>
/// <returns>表示异步操作的Task。</returns>
public async ValueTask PublishAsync<TMessage>(TMessage message, CancellationToken cancellationToken = default)
where TMessage : IChannelMessage
{
var channel = GetOrCreateChannel<TMessage>();
await channel.Writer.WriteAsync(message, cancellationToken);
}
/// <summary>
/// 获取指定消息类型的ChannelReader用于订阅消息。
/// </summary>
/// <typeparam name="TMessage">要订阅的消息类型必须实现IChannelMessage接口。</typeparam>
/// <returns>指定消息类型的ChannelReader。</returns>
public ChannelReader<TMessage> Subscribe<TMessage>()
where TMessage : IChannelMessage
{
var channel = GetOrCreateChannel<TMessage>();
return channel.Reader;
}
/// <summary>
/// 获取或创建指定消息类型的Channel。
/// </summary>
/// <typeparam name="TMessage">消息类型。</typeparam>
/// <returns>指定消息类型的Channel。</returns>
private Channel<TMessage> GetOrCreateChannel<TMessage>()
where TMessage : IChannelMessage
{
// 使用GetOrAdd方法确保线程安全地获取或创建Channel
return (Channel<TMessage>)_channels.GetOrAdd(typeof(TMessage), _ => Channel.CreateUnbounded<TMessage>());
}
}
}