Sfoglia il codice sorgente

1.增加DI注册方式

2.将demo6修改为DI注册方式
3.修改文档
tags/v2.2.3
SmallChi(Koike) 5 anni fa
parent
commit
16252706af
3 ha cambiato i file con 82 aggiunte e 14 eliminazioni
  1. +4
    -9
      README.md
  2. +58
    -4
      src/JT808.Protocol.Test/Simples/Demo6.cs
  3. +20
    -1
      src/JT808.Protocol/DependencyInjectionExtensions.cs

+ 4
- 9
README.md Vedi File

@@ -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)



+ 58
- 4
src/JT808.Protocol.Test/Simples/Demo6.cs Vedi File

@@ -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<DT1Config>()
.AddJT808Configure<DT2Config>();
//2
//serviceDescriptors.AddJT808Configure(new DT1Config())
// .AddJT808Configure(new DT2Config());
//注册工厂
serviceDescriptors.AddSingleton(factory =>
{
Func<string, IJT808Config> accesor = type =>
{
if (type == "DT1")
{
return factory.GetRequiredService<DT1Config>();
}
else if (type == "DT2")
{
return factory.GetRequiredService<DT2Config>();
}
else
{
throw new ArgumentException($"Not Support type : {type}");
}
};
return accesor;
});

IServiceProvider serviceProvider = serviceDescriptors.BuildServiceProvider();
//使用实例的方式获取
IJT808Config DT1JT808Config = serviceProvider.GetRequiredService<DT1Config>();
IJT808Config DT2JT808Config = serviceProvider.GetRequiredService<DT2Config>();
//这边是因为程序集存在协议冲突的情况,所以不直接采用注册程序集的方式。
//根据不同的设备终端号,添加自定义消息Id
DT1JT808Config.MsgIdFactory.SetMap<DT1Demo6>();
DT2JT808Config.MsgIdFactory.SetMap<DT2Demo6>();
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<string, IJT808Config> factory = serviceProvider.GetRequiredService<Func<string, IJT808Config>>();
IJT808Config DT1FactoryJT808Config = factory("DT1");
IJT808Config DT2FactoryJT808Config = factory("DT2");
Assert.Equal("DT1", DT1FactoryJT808Config.ConfigId);
Assert.Equal("DT2", DT2FactoryJT808Config.ConfigId);
}

/// <summary>


+ 20
- 1
src/JT808.Protocol/DependencyInjectionExtensions.cs Vedi File

@@ -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<TJT808Config>(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<TJT808Config>(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();


Caricamento…
Annulla
Salva