diff --git a/README.md b/README.md index 9af8e28..9edaa5a 100644 --- a/README.md +++ b/README.md @@ -222,12 +222,9 @@ JT808Serializer DT2JT808Serializer = new JT808Serializer(DT2JT808Config); ***解决方式:*** -1.凡是解析自定义附加信息Id协议的,先进行分割存储,然后在根据外部的设备类型进行统一处理; +1.可以根据设备类型做个工厂,解耦对公共序列化器的依赖。 -2.可以根据设备类型做个工厂,解耦对公共序列化器的依赖。 - -**3.(推荐): 可以根据设备类型进行初始化DefaultGlobalConfig,根据不同的DefaultGlobalConfig实例去绑定对应 -协议解析器。** +2.可以根据设备类型去实现(GlobalConfigBase)对应的配置,根据不同的GlobalConfigBase实例去绑定对应协议解析器。 [可以参考Simples的Demo4](https://github.com/SmallChi/JT808/blob/master/src/JT808.Protocol.Test/Simples/Demo4.cs) @@ -261,10 +258,8 @@ JT808Serializer DT2JT808Serializer = new JT808Serializer(DT2JT808Config); ***解决方式:*** -方式1: 对于设备来说,设备终端号是唯一标识,可以通过使用设备终端号和消息ID去查询对应的序列化器。 - -**方式2(推荐): 可以根据设备类型进行初始化DefaultGlobalConfig,根据不同的DefaultGlobalConfig实例去绑定对应 -协议解析器。** +可以根据设备类型去实现(GlobalConfigBase)对应的配置,根据不同的GlobalConfigBase实例去绑定对应 +协议解析器。 [可以参考Simples的Demo6](https://github.com/SmallChi/JT808/blob/master/src/JT808.Protocol.Test/Simples/Demo6.cs) diff --git a/src/JT808.Protocol.Test/Simples/Demo6.cs b/src/JT808.Protocol.Test/Simples/Demo6.cs index facc0f8..4ac3602 100644 --- a/src/JT808.Protocol.Test/Simples/Demo6.cs +++ b/src/JT808.Protocol.Test/Simples/Demo6.cs @@ -8,6 +8,7 @@ using System.Reflection; using System.Text; using Xunit; using JT808.Protocol.Formatters; +using Microsoft.Extensions.DependencyInjection; using JT808.Protocol.MessagePack; using JT808.Protocol.Attributes; using JT808.Protocol.Internal; @@ -18,16 +19,69 @@ namespace JT808.Protocol.Test.Simples { public JT808Serializer DT1JT808Serializer; public JT808Serializer DT2JT808Serializer; + + public class DT1Config : GlobalConfigBase + { + public override string ConfigId { get; protected set; } = "DT1"; + } + + public class DT2Config : GlobalConfigBase + { + public override string ConfigId { get; protected set; } = "DT2"; + } + public Demo6() { - IJT808Config DT1JT808Config = new DefaultGlobalConfig(); - IJT808Config DT2JT808Config = new DefaultGlobalConfig(); + IServiceCollection serviceDescriptors = new ServiceCollection(); + //1 + serviceDescriptors.AddJT808Configure() + .AddJT808Configure(); + //2 + //serviceDescriptors.AddJT808Configure(new DT1Config()) + // .AddJT808Configure(new DT2Config()); + //注册工厂 + serviceDescriptors.AddSingleton(factory => + { + Func accesor = type => + { + if (type == "DT1") + { + return factory.GetRequiredService(); + } + else if (type == "DT2") + { + return factory.GetRequiredService(); + } + else + { + throw new ArgumentException($"Not Support type : {type}"); + } + }; + return accesor; + }); + IServiceProvider serviceProvider = serviceDescriptors.BuildServiceProvider(); + //使用实例的方式获取 + IJT808Config DT1JT808Config = serviceProvider.GetRequiredService(); + IJT808Config DT2JT808Config = serviceProvider.GetRequiredService(); + //这边是因为程序集存在协议冲突的情况,所以不直接采用注册程序集的方式。 //根据不同的设备终端号,添加自定义消息Id DT1JT808Config.MsgIdFactory.SetMap(); DT2JT808Config.MsgIdFactory.SetMap(); - DT1JT808Serializer = new JT808Serializer(DT1JT808Config); - DT2JT808Serializer = new JT808Serializer(DT2JT808Config); + + Assert.Equal("DT1", DT1JT808Config.ConfigId); + Assert.Equal("DT2", DT2JT808Config.ConfigId); + DT1JT808Serializer = DT1JT808Config.GetSerializer(); + DT2JT808Serializer = DT2JT808Config.GetSerializer(); + Assert.Equal("DT1", DT1JT808Serializer.SerializerId); + Assert.Equal("DT2", DT2JT808Serializer.SerializerId); + + //使用工厂的方式获取 + Func factory = serviceProvider.GetRequiredService>(); + IJT808Config DT1FactoryJT808Config = factory("DT1"); + IJT808Config DT2FactoryJT808Config = factory("DT2"); + Assert.Equal("DT1", DT1FactoryJT808Config.ConfigId); + Assert.Equal("DT2", DT2FactoryJT808Config.ConfigId); } /// diff --git a/src/JT808.Protocol/DependencyInjectionExtensions.cs b/src/JT808.Protocol/DependencyInjectionExtensions.cs index ad96745..c14d81e 100644 --- a/src/JT808.Protocol/DependencyInjectionExtensions.cs +++ b/src/JT808.Protocol/DependencyInjectionExtensions.cs @@ -12,10 +12,29 @@ namespace JT808.Protocol public static IJT808Builder AddJT808Configure(this IServiceCollection services, IJT808Config jT808Config) { services.AddSingleton(jT808Config.GetType(), jT808Config); - services.AddSingleton(jT808Config); return new DefaultBuilder(services, jT808Config); } + public static IJT808Builder AddJT808Configure(this IJT808Builder builder, IJT808Config jT808Config) + { + builder.Services.AddSingleton(jT808Config.GetType(), jT808Config); + return builder; + } + + public static IJT808Builder AddJT808Configure(this IServiceCollection services)where TJT808Config : IJT808Config,new() + { + var config = new TJT808Config(); + services.AddSingleton(typeof(TJT808Config), config); + return new DefaultBuilder(services, config); + } + + public static IJT808Builder AddJT808Configure(this IJT808Builder builder) where TJT808Config : IJT808Config, new() + { + var config = new TJT808Config(); + builder.Services.AddSingleton(typeof(TJT808Config), config); + return builder; + } + public static IJT808Builder AddJT808Configure(this IServiceCollection services) { DefaultGlobalConfig config = new DefaultGlobalConfig();