Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 6 additions & 1 deletion .github/workflows/publish-to-nuget.yml
Original file line number Diff line number Diff line change
Expand Up @@ -11,12 +11,17 @@ jobs:
runs-on: ubuntu-latest
strategy:
matrix:
folder: [Bones, Bones.Akka, Bones.AspNetCore, Bones.Converters, Bones.Flow, Bones.Grpc, Bones.Tests, Bones.X509, Bones.Akka.Monitoring, Bones.Monitoring]
folder: [Bones, Bones.Akka, Bones.Akka.Tests, Bones.AspNetCore, Bones.Converters, Bones.Flow, Bones.Grpc, Bones.Selectors, Bones.Tests, Bones.X509, Bones.Akka.Monitoring, Bones.Monitoring]
steps:
# Checking out repository
- name: Checkout 🛎️
uses: actions/checkout@v2.3.1

- name: Setup .NET 10.0
uses: actions/setup-dotnet@v4
with:
dotnet-version: '10.0.x'

# pack file to publish to NuGet
- name: Create a NuGet Package 🔧
run: |
Expand Down
179 changes: 179 additions & 0 deletions BACKPORT.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,179 @@
# Backport des composants DAT'Acquisition vers Bones NuGet

## Contexte

DAT'Acquisition utilise Bones via un git submodule local qui a diverge du repo GitHub/NuGet.
Ce document recense chaque ajout/modification necessaire pour pouvoir supprimer le submodule
et utiliser exclusivement les packages NuGet Bones.

Aucun composant backporté n'est specifique a DAT'Acquisition — tous sont des utilitaires generiques.

---

## 1. Bones.Akka — InitializeActor

**Action** : AJOUTER `InitializeActor.cs`

**Justification** : Pattern standard Akka pour les acteurs necessitant une initialisation asynchrone
avec stash des messages et retry avec backoff lineaire. Utilise par 32 acteurs dans DAT'Acquisition.
Ce pattern est documente dans la litterature Akka et n'a aucun couplage metier.

---

## 2. Bones.Akka — RestartException

**Action** : AJOUTER `Exceptions/RestartException.cs`

**Justification** : Exception marker pour les strategies de supervision Akka
("si RestartException → restart l'acteur"). Pattern standard de supervision, 15 fichiers l'utilisent.

---

## 3. Bones.Akka — DisableMessage

**Action** : AJOUTER `Messages/DisableMessage.cs` (singleton)

**Justification** : Message de controle lifecycle acteur complementaire a RestartMessage.
Pattern singleton pour eviter les allocations inutiles (best practice Akka pour les messages sans donnees).

---

## 4. Bones.Akka — RestartMessage

**Action** : MODIFIER `Messages/RestartMessage.cs` — ajouter le pattern singleton

**Justification** : Best practice Akka — les messages sans donnees doivent etre des singletons
pour eviter les allocations. 7 fichiers utilisent `RestartMessage.Instance`.

---

## 5. Bones.Akka — Creator delegates

**Action** : MODIFIER `Creator.cs` — ajouter la covariance `out T` sur `Creator<T>`

**Justification** : La covariance permet d'utiliser un `Creator<ConcreteActor>` la ou un
`Creator<IActorInterface>` est attendu, ce qui est essentiel pour le pattern `AddCreator<TInterface, TActor>()`.
On garde `IActorContext` (plus generique que `IUntypedActorContext`) et `RootCreator<T>` du NuGet actuel.

---

## 6. Bones.Akka — DependencyInjector

**Action** : MODIFIER `DI/DependencyInjector.cs` — ajouter la double registration dans `AddCreator<TInterface, TActor>()`

**Justification** : Quand on enregistre `AddCreator<IDeviceActor, DeviceActor>()`, il faut
pouvoir resoudre aussi bien `Creator<IDeviceActor>` que `Creator<DeviceActor>` (pour les tests).
Le NuGet actuel n'enregistre que l'interface.

---

## 7. Bones.Converters — ToFloat, ToHalf, ToInt/ToUInt sans startIndex, StringConverter

**Action** : MODIFIER `EndianBitConverter.cs` + AJOUTER `StringConverter.cs`

**Justification** :
- `ToFloat(byte[])` : dispatch automatique vers Half/Single/Double selon la taille — essentiel pour les protocoles industriels ou la taille du registre varie
- `ToHalf(byte[], int)` : decodage IEEE 754 half-precision (16 bits) — standard float16
- `ToInt(byte[])` / `ToUInt(byte[])` sans startIndex : surcharges de commodite + support des tailles impaires (3, 5, 6, 7 octets) — les registres Modbus et protocoles IoT utilisent des tailles non standard
- `StringConverter` : conversion hex string ↔ byte array — utilitaire de base pour le debug protocole

Tout est du pur calcul binaire sans couplage metier.

---

## 8. Bones.Flow — ChainOfResponsibility

**Action** : AJOUTER `Core/ChainOfResponsibility/` (4 fichiers) + interfaces (3 fichiers)

**Justification** : Implementation du design pattern Chain of Responsibility, integre au systeme
de pipeline Bones.Flow. Deux variantes : `<TRequest>` (sans resultat) et `<TRequest, TResult>` (avec resultat).
Implemente `IMiddleware` pour etre composable avec Pipeline via `.With(cor)` / `.Add(cor)`.
Utilise par 15 fichiers dans DAT'Acquisition (handlers de contexte, publishers gateway).
Le pattern est un GoF classique, l'implementation ne contient aucun couplage metier.

---

## 9. Bones.Grpc — Interceptors et Extensions

**Action** : AJOUTER `DI/DependencyInjector.cs`,
`Extensions/ByteStringExtensions.cs`, `Interceptors/DeadlineInterceptor.cs`,
`Interceptors/StreamDeadlineInterceptor.cs`

**Justification** : Infrastructure gRPC standard :
- `DeadlineInterceptor` : ajoute un deadline de 5s aux appels unaires — best practice gRPC pour eviter les appels pendants
- `StreamDeadlineInterceptor` : deadline de 30min pour le streaming serveur
- `ByteStringExtensions` : conversion `byte[] → ByteString` (commodite Protobuf)
- Le `NotFoundInterceptor` existe deja dans le NuGet

Chaque applicatif definit sa propre methode d'extension pour composer les interceptors souhaites.

Tout est de l'infrastructure gRPC generique.

---

## 10. Bones.Selectors — Projet complet

**Action** : AJOUTER le projet `Bones.Selectors/` (6 fichiers)

**Justification** : Utilitaire de selection de donnees dans JSON (dot-path) et XML (XPath).
Pattern generique utilise pour l'extraction de valeurs dans des payloads de protocoles.
Aucun couplage metier — c'est l'equivalent d'un JSONPath simplifie.

---

## 11. Bones.Akka.Tests — Helpers de test

**Action** : AJOUTER `AkkaTestClass.cs`, `AkkaActorWrapper.cs`, `ProxyNodeActor.cs`
dans `src/Bones.Akka.Tests/` (librairie, pas projet de test)

**Justification** : Infrastructure de test Akka reutilisable :
- `AkkaTestClass` : classe de base xUnit/TestKit avec helpers (`CreateProxyCreator`, `CreateLogger`, `CreateWrappedActor`)
- `AkkaActorWrapper` : wrapper pour verifier l'existence d'acteurs/enfants dans les tests
- `ProxyNodeActor` : acteur proxy qui forward vers un TestProbe — pattern standard pour mocker les enfants

Le projet de test actuel sur NuGet est un placeholder vide (`Test1() { }`).

---

## 12. Bones.Akka — BaseManager (depuis DAT-Foundation)

**Action** : AJOUTER `BaseManager.cs`

**Justification** : Pattern generique de routage de messages vers des acteurs enfants dynamiques.
L'acteur parent recoit un message, extrait un nom d'enfant (abstract `GetChildName`), cree
l'enfant via Creator<T> s'il n'existe pas, puis forward le message. Ce pattern est utilise
dans DAT-Foundation (DevicesManagerActor, etc.) et correspond exactement a ce que font
DevicesManager, PollersManager, etc. dans DAT-Acquisition — sans la formalisation.

Pattern GoF Mediator/Router, completement generique.

---

## 13. Bones.Akka — DebouncedActor (depuis DAT-Foundation)

**Action** : AJOUTER `DebouncedActor.cs`

**Justification** : Classe de base pour les acteurs qui ont besoin de debouncer des messages
(ne traiter que le dernier message recu dans une fenetre de temps). Utilise les Timers Akka.
Pattern generique utile pour les gateways OPC-UA, les watchers de configuration, etc.

Variante standalone (pas liee a BaseWorker) pour plus de flexibilite.

---

## 14. FakeEntity — Pas de modification

**Action** : AUCUNE — la version NuGet (generique `FakeEntity<T>`) est superieure a la version locale (non-generique `FakeEntity`).
C'est DAT'Acquisition qui devra migrer vers `FakeEntity<T>`.

---

## Composant NON backporte

### MicrosoftDependencyResolver.cs

**Action** : NE PAS backporter

**Justification** : Implementation custom de `IDependencyResolver` (Akka.DI.Core deprecated).
Le NuGet utilise deja `Akka.DependencyInjection` (API moderne). Le code local est 129 lignes
de plomberie que l'API standard rend inutile.
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
<Project Sdk="Microsoft.NET.Sdk">
<ItemGroup>
<PackageReference Include="BenchmarkDotNet" Version="0.13.0" />
<PackageReference Include="BenchmarkDotNet" Version="0.15.4" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\src\Bones.Converters\Bones.Converters.csproj" />
</ItemGroup>

<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net7.0</TargetFramework>
<TargetFramework>net10.0</TargetFramework>
</PropertyGroup>

</Project>
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,14 @@

<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net7.0</TargetFramework>
<TargetFramework>net10.0</TargetFramework>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="akka" Version="1.4.48" />
<PackageReference Include="Microsoft.Extensions.Hosting" Version="7.0.0" />
<PackageReference Include="Opentelemetry.Exporter.Console" Version="1.4.0-rc.2" />
<PackageReference Include="Opentelemetry.Extensions.Hosting" Version="1.4.0-rc.2" />
<PackageReference Include="akka" Version="1.5.62" />
<PackageReference Include="Microsoft.Extensions.Hosting" Version="10.0.5" />
<PackageReference Include="Opentelemetry.Exporter.Console" Version="1.12.0" />
<PackageReference Include="Opentelemetry.Extensions.Hosting" Version="1.12.0" />
</ItemGroup>

<ItemGroup>
Expand Down
10 changes: 5 additions & 5 deletions dev/demo.flow/Demo.Flow.Console/Demo.Flow.Console.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,14 @@

<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net7.0</TargetFramework>
<TargetFramework>net10.0</TargetFramework>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.Http" Version="2.2.2" />
<PackageReference Include="Microsoft.Extensions.Hosting" Version="7.0.0" />
<PackageReference Include="Opentelemetry.Exporter.Console" Version="1.4.0-rc.4" />
<PackageReference Include="Opentelemetry.Extensions.Hosting" Version="1.4.0-rc.4" />
<PackageReference Include="Microsoft.AspNetCore.Http" Version="2.3.0" />
<PackageReference Include="Microsoft.Extensions.Hosting" Version="10.0.5" />
<PackageReference Include="Opentelemetry.Exporter.Console" Version="1.12.0" />
<PackageReference Include="Opentelemetry.Extensions.Hosting" Version="1.12.0" />
</ItemGroup>

<ItemGroup>
Expand Down
10 changes: 5 additions & 5 deletions dev/demo.weaving/app/Demo.Core/Demo.Core.csproj
Original file line number Diff line number Diff line change
@@ -1,16 +1,16 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFramework>net7.0</TargetFramework>
<TargetFramework>net10.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="Akka" Version="1.4.49" />
<PackageReference Include="Bones.Akka.Monitoring.Weaver.Fody" Version="1.0.0" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="7.0.0" />
<PackageReference Include="Microsoft.Extensions.Logging" Version="7.0.0" />
<PackageReference Include="Akka" Version="1.5.62" />
<PackageReference Include="Bones.Akka.Monitoring.Weaver.Fody" Version="$(VERSION)" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="10.0.5" />
<PackageReference Include="Microsoft.Extensions.Logging" Version="10.0.5" />
</ItemGroup>

<ItemGroup>
Expand Down
10 changes: 5 additions & 5 deletions dev/demo.weaving/app/Demo.Runtime/Demo.Runtime.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,16 @@

<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net7.0</TargetFramework>
<TargetFramework>net10.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="Akka" Version="1.4.49" />
<PackageReference Include="Microsoft.Extensions.Hosting" Version="7.0.0" />
<PackageReference Include="Opentelemetry.Exporter.Console" Version="1.4.0" />
<PackageReference Include="Opentelemetry.Extensions.Hosting" Version="1.4.0" />
<PackageReference Include="Akka" Version="1.5.62" />
<PackageReference Include="Microsoft.Extensions.Hosting" Version="10.0.5" />
<PackageReference Include="Opentelemetry.Exporter.Console" Version="1.12.0" />
<PackageReference Include="Opentelemetry.Extensions.Hosting" Version="1.12.0" />
</ItemGroup>

<ItemGroup>
Expand Down
4 changes: 2 additions & 2 deletions dev/demo.weaving/shared/Demo.Domain/Demo.Domain.csproj
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFramework>net7.0</TargetFramework>
<TargetFramework>net10.0</TargetFramework>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="Akka" Version="1.4.49" />
<PackageReference Include="Akka" Version="1.5.62" />
<ProjectReference Include="..\..\..\..\src\Bones.Flow\Bones.Flow.csproj" />
</ItemGroup>

Expand Down
2 changes: 1 addition & 1 deletion dev/dockerfiles/tests-dotnet.dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ RUN find . -type d -empty -delete

# ----------------------------------------

FROM mcr.microsoft.com/dotnet/sdk:7.0
FROM mcr.microsoft.com/dotnet/sdk:10.0

WORKDIR /app

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,6 @@
</PropertyGroup>

<ItemGroup>
<PackageReference Include="FodyHelpers" Version="6.6.4" />
<PackageReference Include="FodyHelpers" Version="6.8.2" />
</ItemGroup>
</Project>
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFramework>net7.0</TargetFramework>
<TargetFramework>net10.0</TargetFramework>
<PackageOutputPath>./nugets</PackageOutputPath>
<Version>$(VERSION)</Version>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="Fody" Version="6.6.4" PrivateAssets="none" />
<PackageReference Include="FodyPackaging" Version="6.6.4" PrivateAssets="All" />
<PackageReference Include="Fody" Version="6.8.2" PrivateAssets="none" />
<PackageReference Include="FodyPackaging" Version="6.8.2" PrivateAssets="All" />
</ItemGroup>
</Project>
8 changes: 4 additions & 4 deletions src/Bones.Akka.Monitoring/Bones.Akka.Monitoring.csproj
Original file line number Diff line number Diff line change
@@ -1,15 +1,15 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net7.0</TargetFramework>
<TargetFramework>net10.0</TargetFramework>
<Version>$(VERSION)</Version>
<Authors>dative-gpi</Authors>
<Company>dative-gpi</Company>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="Akka" Version="1.4.48" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="7.0.0" />
<PackageReference Include="System.Diagnostics.Diagnosticsource" Version="7.0.0" />
<PackageReference Include="Akka" Version="1.5.14" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="8.0.0" />
<PackageReference Include="System.Diagnostics.Diagnosticsource" Version="8.0.1" />
</ItemGroup>

<ItemGroup>
Expand Down
Loading
Loading