Skip to content

Smdn.TPSmartHomeDevices.Primitives version 1.2.0

Latest
Compare
Choose a tag to compare
@smdn smdn released this 07 Apr 12:38
· 3 commits to main since this release
5e3ed9d

Released package

Release notes

The full release notes are available at gist.

Change log

Change log in this release:

API changes

API changes in this release:
diff --git a/doc/api-list/Smdn.TPSmartHomeDevices.Primitives/Smdn.TPSmartHomeDevices.Primitives-net6.0.apilist.cs b/doc/api-list/Smdn.TPSmartHomeDevices.Primitives/Smdn.TPSmartHomeDevices.Primitives-net6.0.apilist.cs
deleted file mode 100644
index 2812903..0000000
--- a/doc/api-list/Smdn.TPSmartHomeDevices.Primitives/Smdn.TPSmartHomeDevices.Primitives-net6.0.apilist.cs
+++ /dev/null
@@ -1,144 +0,0 @@
-// Smdn.TPSmartHomeDevices.Primitives.dll (Smdn.TPSmartHomeDevices.Primitives-1.1.1)
-//   Name: Smdn.TPSmartHomeDevices.Primitives
-//   AssemblyVersion: 1.1.1.0
-//   InformationalVersion: 1.1.1+4a11db50d3b44893248a388ebf4b654f5768e5f3
-//   TargetFramework: .NETCoreApp,Version=v6.0
-//   Configuration: Release
-//   Referenced assemblies:
-//     Microsoft.Extensions.DependencyInjection.Abstractions, Version=6.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60
-//     Smdn.Fundamental.PrintableEncoding.Hexadecimal, Version=3.0.1.0, Culture=neutral
-//     System.Memory, Version=6.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51
-//     System.Net.NetworkInformation, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
-//     System.Net.Primitives, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
-//     System.Runtime, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
-//     System.Text.Json, Version=6.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51
-#nullable enable annotations
-
-using System;
-using System.Net;
-using System.Net.NetworkInformation;
-using System.Text.Json;
-using System.Text.Json.Serialization;
-using System.Threading;
-using System.Threading.Tasks;
-using Microsoft.Extensions.DependencyInjection;
-using Smdn.TPSmartHomeDevices;
-using Smdn.TPSmartHomeDevices.Json;
-
-namespace Smdn.TPSmartHomeDevices {
-  public interface IDeviceEndPoint {
-    ValueTask<EndPoint?> ResolveAsync(CancellationToken cancellationToken = default);
-  }
-
-  public interface IDeviceEndPointFactory<TAddress> where TAddress : notnull {
-    IDeviceEndPoint Create(TAddress address);
-  }
-
-  public interface IDeviceInfo {
-    string? FirmwareVersion { get; }
-    string? HardwareVersion { get; }
-    ReadOnlySpan<byte> Id { get; }
-    PhysicalAddress? MacAddress { get; }
-    string? ModelName { get; }
-  }
-
-  public interface IDynamicDeviceEndPoint : IDeviceEndPoint {
-    void Invalidate();
-  }
-
-  public interface IMulticolorSmartLight : ISmartLight {
-    ValueTask SetColorAsync(int hue, int saturation, int? brightness, TimeSpan transitionPeriod, CancellationToken cancellationToken);
-    ValueTask SetColorTemperatureAsync(int colorTemperature, int? brightness, TimeSpan transitionPeriod, CancellationToken cancellationToken);
-    virtual ValueTask SetOnOffStateAsync(bool newOnOffState, TimeSpan transitionPeriod, CancellationToken cancellationToken) {}
-    virtual ValueTask TurnOffAsync(TimeSpan transitionPeriod, CancellationToken cancellationToken) {}
-    virtual ValueTask TurnOnAsync(TimeSpan transitionPeriod, CancellationToken cancellationToken) {}
-  }
-
-  public interface ISmartDevice {
-    IDeviceEndPoint EndPoint { get; }
-
-    ValueTask<IDeviceInfo> GetDeviceInfoAsync(CancellationToken cancellationToken = default);
-    ValueTask<bool> GetOnOffStateAsync(CancellationToken cancellationToken);
-    ValueTask SetOnOffStateAsync(bool newOnOffState, CancellationToken cancellationToken);
-    virtual ValueTask TurnOffAsync(CancellationToken cancellationToken = default) {}
-    virtual ValueTask TurnOnAsync(CancellationToken cancellationToken = default) {}
-  }
-
-  public interface ISmartLight : ISmartDevice {
-    ValueTask SetBrightnessAsync(int brightness, TimeSpan transitionPeriod, CancellationToken cancellationToken);
-  }
-
-  public static class DeviceEndPoint {
-    public static IDeviceEndPoint Create(EndPoint endPoint) {}
-    public static IDeviceEndPoint Create(IPAddress ipAddress) {}
-    public static IDeviceEndPoint Create(string host) {}
-    public static IDeviceEndPoint Create<TAddress>(TAddress address, IDeviceEndPointFactory<TAddress> endPointFactory) where TAddress : notnull {}
-  }
-
-  public static class DeviceEndPointFactoryServiceCollectionExtensions {
-    public static IServiceCollection AddDeviceEndPointFactory<TAddress>(this IServiceCollection services, IDeviceEndPointFactory<TAddress> endPointFactory) where TAddress : notnull {}
-  }
-
-  public class DeviceEndPointResolutionException : Exception {
-    public DeviceEndPointResolutionException(IDeviceEndPoint deviceEndPoint) {}
-    public DeviceEndPointResolutionException(IDeviceEndPoint deviceEndPoint, string message, Exception? innerException) {}
-
-    public IDeviceEndPoint DeviceEndPoint { get; }
-  }
-
-  public static class IDeviceEndPointExtensions {
-    public static ValueTask<EndPoint> ResolveOrThrowAsync(this IDeviceEndPoint deviceEndPoint, int defaultPort, CancellationToken cancellationToken = default) {}
-  }
-
-  public sealed class StaticDeviceEndPoint : IDeviceEndPoint {
-    public StaticDeviceEndPoint(EndPoint endPoint) {}
-
-    public ValueTask<EndPoint?> ResolveAsync(CancellationToken cancellationToken = default) {}
-    public override string? ToString() {}
-  }
-}
-
-namespace Smdn.TPSmartHomeDevices.Json {
-  public sealed class Base16ByteArrayJsonConverter : JsonConverter<byte[]> {
-    public Base16ByteArrayJsonConverter() {}
-
-    public override byte[]? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) {}
-    public override void Write(Utf8JsonWriter writer, byte[]? @value, JsonSerializerOptions options) {}
-  }
-
-  public sealed class GeolocationInDecimalDegreesJsonConverter : JsonConverter<decimal?> {
-    public GeolocationInDecimalDegreesJsonConverter() {}
-
-    public override decimal? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) {}
-    public override void Write(Utf8JsonWriter writer, decimal? @value, JsonSerializerOptions options) {}
-  }
-
-  public sealed class MacAddressJsonConverter : JsonConverter<PhysicalAddress> {
-    public MacAddressJsonConverter() {}
-
-    public override PhysicalAddress? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) {}
-    public override void Write(Utf8JsonWriter writer, PhysicalAddress @value, JsonSerializerOptions options) {}
-  }
-
-  public sealed class TimeSpanInMinutesJsonConverter : TimeSpanJsonConverter {
-    public TimeSpanInMinutesJsonConverter() {}
-
-    protected override TimeSpan ToTimeSpan(int @value) {}
-  }
-
-  public sealed class TimeSpanInSecondsJsonConverter : TimeSpanJsonConverter {
-    public TimeSpanInSecondsJsonConverter() {}
-
-    protected override TimeSpan ToTimeSpan(int @value) {}
-  }
-
-  public abstract class TimeSpanJsonConverter : JsonConverter<TimeSpan?> {
-    protected TimeSpanJsonConverter() {}
-
-    public override TimeSpan? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) {}
-    protected abstract TimeSpan ToTimeSpan(int @value);
-    public override void Write(Utf8JsonWriter writer, TimeSpan? @value, JsonSerializerOptions options) {}
-  }
-}
-// API list generated by Smdn.Reflection.ReverseGenerating.ListApi.MSBuild.Tasks v1.3.2.0.
-// Smdn.Reflection.ReverseGenerating.ListApi.Core v1.2.0.0 (https://github.com/smdn/Smdn.Reflection.ReverseGenerating)
diff --git a/doc/api-list/Smdn.TPSmartHomeDevices.Primitives/Smdn.TPSmartHomeDevices.Primitives-net8.0.apilist.cs b/doc/api-list/Smdn.TPSmartHomeDevices.Primitives/Smdn.TPSmartHomeDevices.Primitives-net8.0.apilist.cs
index e74ca49..76dc8ca 100644
--- a/doc/api-list/Smdn.TPSmartHomeDevices.Primitives/Smdn.TPSmartHomeDevices.Primitives-net8.0.apilist.cs
+++ b/doc/api-list/Smdn.TPSmartHomeDevices.Primitives/Smdn.TPSmartHomeDevices.Primitives-net8.0.apilist.cs
@@ -1,144 +1,146 @@
-// Smdn.TPSmartHomeDevices.Primitives.dll (Smdn.TPSmartHomeDevices.Primitives-1.1.1)
+// Smdn.TPSmartHomeDevices.Primitives.dll (Smdn.TPSmartHomeDevices.Primitives-1.2.0)
 //   Name: Smdn.TPSmartHomeDevices.Primitives
-//   AssemblyVersion: 1.1.1.0
-//   InformationalVersion: 1.1.1+4a11db50d3b44893248a388ebf4b654f5768e5f3
+//   AssemblyVersion: 1.2.0.0
+//   InformationalVersion: 1.2.0+be3f9665369dfc6bd14daf1ebef9fed77aa34d40
 //   TargetFramework: .NETCoreApp,Version=v8.0
 //   Configuration: Release
 //   Referenced assemblies:
 //     Microsoft.Extensions.DependencyInjection.Abstractions, Version=6.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60
 //     Smdn.Fundamental.PrintableEncoding.Hexadecimal, Version=3.0.1.0, Culture=neutral
+//     System.ComponentModel, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
 //     System.Memory, Version=8.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51
 //     System.Net.NetworkInformation, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
 //     System.Net.Primitives, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
 //     System.Runtime, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
 //     System.Text.Json, Version=8.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51
 #nullable enable annotations
 
 using System;
 using System.Net;
 using System.Net.NetworkInformation;
 using System.Text.Json;
 using System.Text.Json.Serialization;
 using System.Threading;
 using System.Threading.Tasks;
 using Microsoft.Extensions.DependencyInjection;
 using Smdn.TPSmartHomeDevices;
 using Smdn.TPSmartHomeDevices.Json;
 
 namespace Smdn.TPSmartHomeDevices {
   public interface IDeviceEndPoint {
     ValueTask<EndPoint?> ResolveAsync(CancellationToken cancellationToken = default);
   }
 
   public interface IDeviceEndPointFactory<TAddress> where TAddress : notnull {
     IDeviceEndPoint Create(TAddress address);
   }
 
   public interface IDeviceInfo {
     string? FirmwareVersion { get; }
     string? HardwareVersion { get; }
     ReadOnlySpan<byte> Id { get; }
     PhysicalAddress? MacAddress { get; }
     string? ModelName { get; }
   }
 
   public interface IDynamicDeviceEndPoint : IDeviceEndPoint {
     void Invalidate();
   }
 
   public interface IMulticolorSmartLight : ISmartLight {
     ValueTask SetColorAsync(int hue, int saturation, int? brightness, TimeSpan transitionPeriod, CancellationToken cancellationToken);
     ValueTask SetColorTemperatureAsync(int colorTemperature, int? brightness, TimeSpan transitionPeriod, CancellationToken cancellationToken);
     virtual ValueTask SetOnOffStateAsync(bool newOnOffState, TimeSpan transitionPeriod, CancellationToken cancellationToken) {}
     virtual ValueTask TurnOffAsync(TimeSpan transitionPeriod, CancellationToken cancellationToken) {}
     virtual ValueTask TurnOnAsync(TimeSpan transitionPeriod, CancellationToken cancellationToken) {}
   }
 
   public interface ISmartDevice {
     IDeviceEndPoint EndPoint { get; }
 
     ValueTask<IDeviceInfo> GetDeviceInfoAsync(CancellationToken cancellationToken = default);
     ValueTask<bool> GetOnOffStateAsync(CancellationToken cancellationToken);
     ValueTask SetOnOffStateAsync(bool newOnOffState, CancellationToken cancellationToken);
     virtual ValueTask TurnOffAsync(CancellationToken cancellationToken = default) {}
     virtual ValueTask TurnOnAsync(CancellationToken cancellationToken = default) {}
   }
 
   public interface ISmartLight : ISmartDevice {
     ValueTask SetBrightnessAsync(int brightness, TimeSpan transitionPeriod, CancellationToken cancellationToken);
   }
 
   public static class DeviceEndPoint {
     public static IDeviceEndPoint Create(EndPoint endPoint) {}
     public static IDeviceEndPoint Create(IPAddress ipAddress) {}
     public static IDeviceEndPoint Create(string host) {}
     public static IDeviceEndPoint Create<TAddress>(TAddress address, IDeviceEndPointFactory<TAddress> endPointFactory) where TAddress : notnull {}
   }
 
   public static class DeviceEndPointFactoryServiceCollectionExtensions {
+    public static IServiceCollection AddDeviceEndPointFactory<TAddress>(this IServiceCollection services, Func<IServiceProvider, IDeviceEndPointFactory<TAddress>> implementationFactoryForEndPointFactory) where TAddress : notnull {}
     public static IServiceCollection AddDeviceEndPointFactory<TAddress>(this IServiceCollection services, IDeviceEndPointFactory<TAddress> endPointFactory) where TAddress : notnull {}
   }
 
   public class DeviceEndPointResolutionException : Exception {
     public DeviceEndPointResolutionException(IDeviceEndPoint deviceEndPoint) {}
     public DeviceEndPointResolutionException(IDeviceEndPoint deviceEndPoint, string message, Exception? innerException) {}
 
     public IDeviceEndPoint DeviceEndPoint { get; }
   }
 
   public static class IDeviceEndPointExtensions {
     public static ValueTask<EndPoint> ResolveOrThrowAsync(this IDeviceEndPoint deviceEndPoint, int defaultPort, CancellationToken cancellationToken = default) {}
   }
 
   public sealed class StaticDeviceEndPoint : IDeviceEndPoint {
     public StaticDeviceEndPoint(EndPoint endPoint) {}
 
     public ValueTask<EndPoint?> ResolveAsync(CancellationToken cancellationToken = default) {}
     public override string? ToString() {}
   }
 }
 
 namespace Smdn.TPSmartHomeDevices.Json {
   public sealed class Base16ByteArrayJsonConverter : JsonConverter<byte[]> {
     public Base16ByteArrayJsonConverter() {}
 
     public override byte[]? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) {}
     public override void Write(Utf8JsonWriter writer, byte[]? @value, JsonSerializerOptions options) {}
   }
 
   public sealed class GeolocationInDecimalDegreesJsonConverter : JsonConverter<decimal?> {
     public GeolocationInDecimalDegreesJsonConverter() {}
 
     public override decimal? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) {}
     public override void Write(Utf8JsonWriter writer, decimal? @value, JsonSerializerOptions options) {}
   }
 
   public sealed class MacAddressJsonConverter : JsonConverter<PhysicalAddress> {
     public MacAddressJsonConverter() {}
 
     public override PhysicalAddress? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) {}
     public override void Write(Utf8JsonWriter writer, PhysicalAddress @value, JsonSerializerOptions options) {}
   }
 
   public sealed class TimeSpanInMinutesJsonConverter : TimeSpanJsonConverter {
     public TimeSpanInMinutesJsonConverter() {}
 
     protected override TimeSpan ToTimeSpan(int @value) {}
   }
 
   public sealed class TimeSpanInSecondsJsonConverter : TimeSpanJsonConverter {
     public TimeSpanInSecondsJsonConverter() {}
 
     protected override TimeSpan ToTimeSpan(int @value) {}
   }
 
   public abstract class TimeSpanJsonConverter : JsonConverter<TimeSpan?> {
     protected TimeSpanJsonConverter() {}
 
     public override TimeSpan? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) {}
     protected abstract TimeSpan ToTimeSpan(int @value);
     public override void Write(Utf8JsonWriter writer, TimeSpan? @value, JsonSerializerOptions options) {}
   }
 }
-// API list generated by Smdn.Reflection.ReverseGenerating.ListApi.MSBuild.Tasks v1.3.2.0.
-// Smdn.Reflection.ReverseGenerating.ListApi.Core v1.2.0.0 (https://github.com/smdn/Smdn.Reflection.ReverseGenerating)
+// API list generated by Smdn.Reflection.ReverseGenerating.ListApi.MSBuild.Tasks v1.5.0.0.
+// Smdn.Reflection.ReverseGenerating.ListApi.Core v1.3.1.0 (https://github.com/smdn/Smdn.Reflection.ReverseGenerating)
diff --git a/doc/api-list/Smdn.TPSmartHomeDevices.Primitives/Smdn.TPSmartHomeDevices.Primitives-netstandard2.0.apilist.cs b/doc/api-list/Smdn.TPSmartHomeDevices.Primitives/Smdn.TPSmartHomeDevices.Primitives-netstandard2.0.apilist.cs
index cb8e748..25773fa 100644
--- a/doc/api-list/Smdn.TPSmartHomeDevices.Primitives/Smdn.TPSmartHomeDevices.Primitives-netstandard2.0.apilist.cs
+++ b/doc/api-list/Smdn.TPSmartHomeDevices.Primitives/Smdn.TPSmartHomeDevices.Primitives-netstandard2.0.apilist.cs
@@ -1,138 +1,139 @@
-// Smdn.TPSmartHomeDevices.Primitives.dll (Smdn.TPSmartHomeDevices.Primitives-1.1.1)
+// Smdn.TPSmartHomeDevices.Primitives.dll (Smdn.TPSmartHomeDevices.Primitives-1.2.0)
 //   Name: Smdn.TPSmartHomeDevices.Primitives
-//   AssemblyVersion: 1.1.1.0
-//   InformationalVersion: 1.1.1+4a11db50d3b44893248a388ebf4b654f5768e5f3
+//   AssemblyVersion: 1.2.0.0
+//   InformationalVersion: 1.2.0+be3f9665369dfc6bd14daf1ebef9fed77aa34d40
 //   TargetFramework: .NETStandard,Version=v2.0
 //   Configuration: Release
 //   Referenced assemblies:
 //     Microsoft.Extensions.DependencyInjection.Abstractions, Version=6.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60
 //     Smdn.Fundamental.PrintableEncoding.Hexadecimal, Version=3.0.1.0, Culture=neutral
 //     System.Memory, Version=4.0.1.1, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51
 //     System.Text.Json, Version=6.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51
 //     System.Threading.Tasks.Extensions, Version=4.2.0.1, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51
 //     netstandard, Version=2.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51
 #nullable enable annotations
 
 using System;
 using System.Net;
 using System.Net.NetworkInformation;
 using System.Text.Json;
 using System.Text.Json.Serialization;
 using System.Threading;
 using System.Threading.Tasks;
 using Microsoft.Extensions.DependencyInjection;
 using Smdn.TPSmartHomeDevices;
 using Smdn.TPSmartHomeDevices.Json;
 
 namespace Smdn.TPSmartHomeDevices {
   public interface IDeviceEndPoint {
     ValueTask<EndPoint?> ResolveAsync(CancellationToken cancellationToken = default);
   }
 
   public interface IDeviceEndPointFactory<TAddress> where TAddress : notnull {
     IDeviceEndPoint Create(TAddress address);
   }
 
   public interface IDeviceInfo {
     string? FirmwareVersion { get; }
     string? HardwareVersion { get; }
     ReadOnlySpan<byte> Id { get; }
     PhysicalAddress? MacAddress { get; }
     string? ModelName { get; }
   }
 
   public interface IDynamicDeviceEndPoint : IDeviceEndPoint {
     void Invalidate();
   }
 
   public interface IMulticolorSmartLight : ISmartLight {
     ValueTask SetColorAsync(int hue, int saturation, int? brightness, TimeSpan transitionPeriod, CancellationToken cancellationToken);
     ValueTask SetColorTemperatureAsync(int colorTemperature, int? brightness, TimeSpan transitionPeriod, CancellationToken cancellationToken);
   }
 
   public interface ISmartDevice {
     IDeviceEndPoint EndPoint { get; }
 
     ValueTask<IDeviceInfo> GetDeviceInfoAsync(CancellationToken cancellationToken = default);
     ValueTask<bool> GetOnOffStateAsync(CancellationToken cancellationToken);
     ValueTask SetOnOffStateAsync(bool newOnOffState, CancellationToken cancellationToken);
   }
 
   public interface ISmartLight : ISmartDevice {
     ValueTask SetBrightnessAsync(int brightness, TimeSpan transitionPeriod, CancellationToken cancellationToken);
   }
 
   public static class DeviceEndPoint {
     public static IDeviceEndPoint Create(EndPoint endPoint) {}
     public static IDeviceEndPoint Create(IPAddress ipAddress) {}
     public static IDeviceEndPoint Create(string host) {}
     public static IDeviceEndPoint Create<TAddress>(TAddress address, IDeviceEndPointFactory<TAddress> endPointFactory) where TAddress : notnull {}
   }
 
   public static class DeviceEndPointFactoryServiceCollectionExtensions {
+    public static IServiceCollection AddDeviceEndPointFactory<TAddress>(this IServiceCollection services, Func<IServiceProvider, IDeviceEndPointFactory<TAddress>> implementationFactoryForEndPointFactory) where TAddress : notnull {}
     public static IServiceCollection AddDeviceEndPointFactory<TAddress>(this IServiceCollection services, IDeviceEndPointFactory<TAddress> endPointFactory) where TAddress : notnull {}
   }
 
   public class DeviceEndPointResolutionException : Exception {
     public DeviceEndPointResolutionException(IDeviceEndPoint deviceEndPoint) {}
     public DeviceEndPointResolutionException(IDeviceEndPoint deviceEndPoint, string message, Exception? innerException) {}
 
     public IDeviceEndPoint DeviceEndPoint { get; }
   }
 
   public static class IDeviceEndPointExtensions {
     public static ValueTask<EndPoint> ResolveOrThrowAsync(this IDeviceEndPoint deviceEndPoint, int defaultPort, CancellationToken cancellationToken = default) {}
   }
 
   public sealed class StaticDeviceEndPoint : IDeviceEndPoint {
     public StaticDeviceEndPoint(EndPoint endPoint) {}
 
     public ValueTask<EndPoint?> ResolveAsync(CancellationToken cancellationToken = default) {}
     public override string? ToString() {}
   }
 }
 
 namespace Smdn.TPSmartHomeDevices.Json {
   public sealed class Base16ByteArrayJsonConverter : JsonConverter<byte[]> {
     public Base16ByteArrayJsonConverter() {}
 
     public override byte[]? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) {}
     public override void Write(Utf8JsonWriter writer, byte[]? @value, JsonSerializerOptions options) {}
   }
 
   public sealed class GeolocationInDecimalDegreesJsonConverter : JsonConverter<decimal?> {
     public GeolocationInDecimalDegreesJsonConverter() {}
 
     public override decimal? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) {}
     public override void Write(Utf8JsonWriter writer, decimal? @value, JsonSerializerOptions options) {}
   }
 
   public sealed class MacAddressJsonConverter : JsonConverter<PhysicalAddress> {
     public MacAddressJsonConverter() {}
 
     public override PhysicalAddress? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) {}
     public override void Write(Utf8JsonWriter writer, PhysicalAddress @value, JsonSerializerOptions options) {}
   }
 
   public sealed class TimeSpanInMinutesJsonConverter : TimeSpanJsonConverter {
     public TimeSpanInMinutesJsonConverter() {}
 
     protected override TimeSpan ToTimeSpan(int @value) {}
   }
 
   public sealed class TimeSpanInSecondsJsonConverter : TimeSpanJsonConverter {
     public TimeSpanInSecondsJsonConverter() {}
 
     protected override TimeSpan ToTimeSpan(int @value) {}
   }
 
   public abstract class TimeSpanJsonConverter : JsonConverter<TimeSpan?> {
     protected TimeSpanJsonConverter() {}
 
     public override TimeSpan? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) {}
     protected abstract TimeSpan ToTimeSpan(int @value);
     public override void Write(Utf8JsonWriter writer, TimeSpan? @value, JsonSerializerOptions options) {}
   }
 }
-// API list generated by Smdn.Reflection.ReverseGenerating.ListApi.MSBuild.Tasks v1.3.2.0.
-// Smdn.Reflection.ReverseGenerating.ListApi.Core v1.2.0.0 (https://github.com/smdn/Smdn.Reflection.ReverseGenerating)
+// API list generated by Smdn.Reflection.ReverseGenerating.ListApi.MSBuild.Tasks v1.5.0.0.
+// Smdn.Reflection.ReverseGenerating.ListApi.Core v1.3.1.0 (https://github.com/smdn/Smdn.Reflection.ReverseGenerating)
diff --git a/doc/api-list/Smdn.TPSmartHomeDevices.Primitives/Smdn.TPSmartHomeDevices.Primitives-netstandard2.1.apilist.cs b/doc/api-list/Smdn.TPSmartHomeDevices.Primitives/Smdn.TPSmartHomeDevices.Primitives-netstandard2.1.apilist.cs
index d8b9da7..cede06b 100644
--- a/doc/api-list/Smdn.TPSmartHomeDevices.Primitives/Smdn.TPSmartHomeDevices.Primitives-netstandard2.1.apilist.cs
+++ b/doc/api-list/Smdn.TPSmartHomeDevices.Primitives/Smdn.TPSmartHomeDevices.Primitives-netstandard2.1.apilist.cs
@@ -1,136 +1,137 @@
-// Smdn.TPSmartHomeDevices.Primitives.dll (Smdn.TPSmartHomeDevices.Primitives-1.1.1)
+// Smdn.TPSmartHomeDevices.Primitives.dll (Smdn.TPSmartHomeDevices.Primitives-1.2.0)
 //   Name: Smdn.TPSmartHomeDevices.Primitives
-//   AssemblyVersion: 1.1.1.0
-//   InformationalVersion: 1.1.1+4a11db50d3b44893248a388ebf4b654f5768e5f3
+//   AssemblyVersion: 1.2.0.0
+//   InformationalVersion: 1.2.0+be3f9665369dfc6bd14daf1ebef9fed77aa34d40
 //   TargetFramework: .NETStandard,Version=v2.1
 //   Configuration: Release
 //   Referenced assemblies:
 //     Microsoft.Extensions.DependencyInjection.Abstractions, Version=6.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60
 //     Smdn.Fundamental.PrintableEncoding.Hexadecimal, Version=3.0.1.0, Culture=neutral
 //     System.Text.Json, Version=6.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51
 //     netstandard, Version=2.1.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51
 #nullable enable annotations
 
 using System;
 using System.Net;
 using System.Net.NetworkInformation;
 using System.Text.Json;
 using System.Text.Json.Serialization;
 using System.Threading;
 using System.Threading.Tasks;
 using Microsoft.Extensions.DependencyInjection;
 using Smdn.TPSmartHomeDevices;
 using Smdn.TPSmartHomeDevices.Json;
 
 namespace Smdn.TPSmartHomeDevices {
   public interface IDeviceEndPoint {
     ValueTask<EndPoint?> ResolveAsync(CancellationToken cancellationToken = default);
   }
 
   public interface IDeviceEndPointFactory<TAddress> where TAddress : notnull {
     IDeviceEndPoint Create(TAddress address);
   }
 
   public interface IDeviceInfo {
     string? FirmwareVersion { get; }
     string? HardwareVersion { get; }
     ReadOnlySpan<byte> Id { get; }
     PhysicalAddress? MacAddress { get; }
     string? ModelName { get; }
   }
 
   public interface IDynamicDeviceEndPoint : IDeviceEndPoint {
     void Invalidate();
   }
 
   public interface IMulticolorSmartLight : ISmartLight {
     ValueTask SetColorAsync(int hue, int saturation, int? brightness, TimeSpan transitionPeriod, CancellationToken cancellationToken);
     ValueTask SetColorTemperatureAsync(int colorTemperature, int? brightness, TimeSpan transitionPeriod, CancellationToken cancellationToken);
   }
 
   public interface ISmartDevice {
     IDeviceEndPoint EndPoint { get; }
 
     ValueTask<IDeviceInfo> GetDeviceInfoAsync(CancellationToken cancellationToken = default);
     ValueTask<bool> GetOnOffStateAsync(CancellationToken cancellationToken);
     ValueTask SetOnOffStateAsync(bool newOnOffState, CancellationToken cancellationToken);
   }
 
   public interface ISmartLight : ISmartDevice {
     ValueTask SetBrightnessAsync(int brightness, TimeSpan transitionPeriod, CancellationToken cancellationToken);
   }
 
   public static class DeviceEndPoint {
     public static IDeviceEndPoint Create(EndPoint endPoint) {}
     public static IDeviceEndPoint Create(IPAddress ipAddress) {}
     public static IDeviceEndPoint Create(string host) {}
     public static IDeviceEndPoint Create<TAddress>(TAddress address, IDeviceEndPointFactory<TAddress> endPointFactory) where TAddress : notnull {}
   }
 
   public static class DeviceEndPointFactoryServiceCollectionExtensions {
+    public static IServiceCollection AddDeviceEndPointFactory<TAddress>(this IServiceCollection services, Func<IServiceProvider, IDeviceEndPointFactory<TAddress>> implementationFactoryForEndPointFactory) where TAddress : notnull {}
     public static IServiceCollection AddDeviceEndPointFactory<TAddress>(this IServiceCollection services, IDeviceEndPointFactory<TAddress> endPointFactory) where TAddress : notnull {}
   }
 
   public class DeviceEndPointResolutionException : Exception {
     public DeviceEndPointResolutionException(IDeviceEndPoint deviceEndPoint) {}
     public DeviceEndPointResolutionException(IDeviceEndPoint deviceEndPoint, string message, Exception? innerException) {}
 
     public IDeviceEndPoint DeviceEndPoint { get; }
   }
 
   public static class IDeviceEndPointExtensions {
     public static ValueTask<EndPoint> ResolveOrThrowAsync(this IDeviceEndPoint deviceEndPoint, int defaultPort, CancellationToken cancellationToken = default) {}
   }
 
   public sealed class StaticDeviceEndPoint : IDeviceEndPoint {
     public StaticDeviceEndPoint(EndPoint endPoint) {}
 
     public ValueTask<EndPoint?> ResolveAsync(CancellationToken cancellationToken = default) {}
     public override string? ToString() {}
   }
 }
 
 namespace Smdn.TPSmartHomeDevices.Json {
   public sealed class Base16ByteArrayJsonConverter : JsonConverter<byte[]> {
     public Base16ByteArrayJsonConverter() {}
 
     public override byte[]? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) {}
     [...] public override <unknown> Write(...) {}
   }
 
   public sealed class GeolocationInDecimalDegreesJsonConverter : JsonConverter<decimal?> {
     public GeolocationInDecimalDegreesJsonConverter() {}
 
     public override decimal? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) {}
     [...] public override <unknown> Write(...) {}
   }
 
   public sealed class MacAddressJsonConverter : JsonConverter<PhysicalAddress> {
     public MacAddressJsonConverter() {}
 
     public override PhysicalAddress? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) {}
     [...] public override <unknown> Write(...) {}
   }
 
   public sealed class TimeSpanInMinutesJsonConverter : TimeSpanJsonConverter {
     public TimeSpanInMinutesJsonConverter() {}
 
     protected override TimeSpan ToTimeSpan(int @value) {}
   }
 
   public sealed class TimeSpanInSecondsJsonConverter : TimeSpanJsonConverter {
     public TimeSpanInSecondsJsonConverter() {}
 
     protected override TimeSpan ToTimeSpan(int @value) {}
   }
 
   public abstract class TimeSpanJsonConverter : JsonConverter<TimeSpan?> {
     protected TimeSpanJsonConverter() {}
 
     public override TimeSpan? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) {}
     protected abstract TimeSpan ToTimeSpan(int @value);
     [...] public override <unknown> Write(...) {}
   }
 }
-// API list generated by Smdn.Reflection.ReverseGenerating.ListApi.MSBuild.Tasks v1.3.2.0.
-// Smdn.Reflection.ReverseGenerating.ListApi.Core v1.2.0.0 (https://github.com/smdn/Smdn.Reflection.ReverseGenerating)
+// API list generated by Smdn.Reflection.ReverseGenerating.ListApi.MSBuild.Tasks v1.5.0.0.
+// Smdn.Reflection.ReverseGenerating.ListApi.Core v1.3.1.0 (https://github.com/smdn/Smdn.Reflection.ReverseGenerating)

Full changes

Full changes in this release:
diff --git a/src/Smdn.TPSmartHomeDevices.Primitives/Smdn.TPSmartHomeDevices.Primitives.csproj b/src/Smdn.TPSmartHomeDevices.Primitives/Smdn.TPSmartHomeDevices.Primitives.csproj
index e732927..6373b50 100644
--- a/src/Smdn.TPSmartHomeDevices.Primitives/Smdn.TPSmartHomeDevices.Primitives.csproj
+++ b/src/Smdn.TPSmartHomeDevices.Primitives/Smdn.TPSmartHomeDevices.Primitives.csproj
@@ -4,8 +4,8 @@ SPDX-License-Identifier: MIT
 -->
 <Project Sdk="Microsoft.NET.Sdk">
   <PropertyGroup>
-    <TargetFrameworks>netstandard2.0;netstandard2.1;net6.0;net8.0</TargetFrameworks>
-    <VersionPrefix>1.1.1</VersionPrefix>
+    <TargetFrameworks>net8.0;netstandard2.1;netstandard2.0</TargetFrameworks>
+    <VersionPrefix>1.2.0</VersionPrefix>
     <VersionSuffix></VersionSuffix>
     <PackageValidationBaselineVersion>1.0.0</PackageValidationBaselineVersion>
     <RootNamespace/> <!-- empty the root namespace so that the namespace is determined only by the directory name, for code style rule IDE0030 -->
diff --git a/src/Smdn.TPSmartHomeDevices.Primitives/Smdn.TPSmartHomeDevices/DeviceEndPointFactoryServiceCollectionExtensions.cs b/src/Smdn.TPSmartHomeDevices.Primitives/Smdn.TPSmartHomeDevices/DeviceEndPointFactoryServiceCollectionExtensions.cs
index aa67a3e..83c73cd 100644
--- a/src/Smdn.TPSmartHomeDevices.Primitives/Smdn.TPSmartHomeDevices/DeviceEndPointFactoryServiceCollectionExtensions.cs
+++ b/src/Smdn.TPSmartHomeDevices.Primitives/Smdn.TPSmartHomeDevices/DeviceEndPointFactoryServiceCollectionExtensions.cs
@@ -29,4 +29,33 @@ public static class DeviceEndPointFactoryServiceCollectionExtensions {
 
     return services;
   }
+
+  /// <summary>
+  /// Adds <see cref="IDeviceEndPointFactory{TAddress}"/> to create an <see cref="IDeviceEndPoint"/>
+  /// that uses <typeparamref name="TAddress"/> as the address type to represent the device endpoint.
+  /// </summary>
+  /// <typeparam name="TAddress">The type that represents an address of device endpoint.</typeparam>
+  /// <param name="services">The <see cref="IServiceCollection"/> to add services to.</param>
+  /// <param name="implementationFactoryForEndPointFactory">
+  /// The factory that creates the <see cref="IDeviceEndPointFactory{TAddress}"/> that is to be added to the services.
+  /// </param>
+  public static IServiceCollection AddDeviceEndPointFactory<TAddress>(
+    this IServiceCollection services,
+    Func<IServiceProvider, IDeviceEndPointFactory<TAddress>> implementationFactoryForEndPointFactory
+  ) where TAddress : notnull
+  {
+    if (services is null)
+      throw new ArgumentNullException(nameof(services));
+    if (implementationFactoryForEndPointFactory is null)
+      throw new ArgumentNullException(nameof(implementationFactoryForEndPointFactory));
+
+    services.TryAdd(
+      ServiceDescriptor.Singleton(
+        typeof(IDeviceEndPointFactory<TAddress>),
+        implementationFactory: implementationFactoryForEndPointFactory
+      )
+    );
+
+    return services;
+  }
 }

Notes

Full Changelog: releases/Smdn.TPSmartHomeDevices.Primitives-1.1.1...releases/Smdn.TPSmartHomeDevices.Primitives-1.2.0