Skip to content

Commit

Permalink
Make HubFactory a singleton
Browse files Browse the repository at this point in the history
#37 breaking
  • Loading branch information
tthiery committed Jul 8, 2020
1 parent 5331409 commit c588e93
Show file tree
Hide file tree
Showing 9 changed files with 49 additions and 18 deletions.
10 changes: 5 additions & 5 deletions examples/SharpBrick.PoweredUp.Examples/BaseExample.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using SharpBrick.PoweredUp;
using SharpBrick.PoweredUp.Bluetooth;
using SharpBrick.PoweredUp.Functions;
using SharpBrick.PoweredUp.WinRT;

Expand Down Expand Up @@ -36,18 +37,17 @@ public void CreateHostAndDiscover(bool enableTrace)
{
builder.AddFilter("SharpBrick.PoweredUp.Bluetooth.BluetoothKernel", LogLevel.Debug);
}
});
})
.AddSingleton<IPoweredUpBluetoothAdapter, WinRTPoweredUpBluetoothAdapter>()
;

Configure(serviceCollection);

serviceProvider = serviceCollection.BuildServiceProvider();


var logger = serviceProvider.GetService<ILoggerFactory>().CreateLogger("Main");

var poweredUpBluetoothAdapter = new WinRTPoweredUpBluetoothAdapter();

host = new PoweredUpHost(poweredUpBluetoothAdapter, serviceProvider);
host = serviceProvider.GetService<PoweredUpHost>();

Hub result = null;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
using SharpBrick.PoweredUp;
using SharpBrick.PoweredUp.Devices;
using SharpBrick.PoweredUp.Protocol;
using SharpBrick.PoweredUp.Hubs;

namespace Example
{
Expand All @@ -22,7 +23,9 @@ public class ExampleDynamicDevice : BaseExample
public override void Configure(IServiceCollection services)
{
// pretend we do not know the device and use only dynamic ones
services.AddSingleton<IHubFactory, HubFactory>();
services.AddSingleton<IDeviceFactory, EmptyDeviceFactory>();
services.AddSingleton<PoweredUpHost>();
}

public override async Task ExecuteAsync()
Expand Down
12 changes: 10 additions & 2 deletions src/SharpBrick.PoweredUp/Devices/DeviceFactory.cs
Original file line number Diff line number Diff line change
@@ -1,22 +1,30 @@
using System;
using Microsoft.Extensions.DependencyInjection;
using SharpBrick.PoweredUp.Protocol;

namespace SharpBrick.PoweredUp.Devices
{
public class DeviceFactory : IDeviceFactory
{
private readonly IServiceProvider _serviceProvider;

public DeviceFactory(IServiceProvider serviceProvider)
{
_serviceProvider = serviceProvider ?? throw new ArgumentNullException(nameof(serviceProvider));
}

public IPoweredUpDevice Create(DeviceType deviceType)
{
var type = GetTypeFromDeviceType(deviceType);

return (type == null) ? null : (IPoweredUpDevice)Activator.CreateInstance(type);
return (type == null) ? null : (IPoweredUpDevice)ActivatorUtilities.CreateInstance(_serviceProvider, type);
}

public IPoweredUpDevice CreateConnected(DeviceType deviceType, IPoweredUpProtocol protocol, byte hubId, byte portId)
{
var type = GetTypeFromDeviceType(deviceType);

return (type == null) ? new DynamicDevice(protocol, hubId, portId) : (IPoweredUpDevice)Activator.CreateInstance(type, protocol, hubId, portId);
return (type == null) ? new DynamicDevice(protocol, hubId, portId) : (IPoweredUpDevice)ActivatorUtilities.CreateInstance(_serviceProvider, type, protocol, hubId, portId);
}

public Type GetTypeFromDeviceType(DeviceType deviceType)
Expand Down
1 change: 1 addition & 0 deletions src/SharpBrick.PoweredUp/Devices/Mode.cs
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ public class Mode : IDisposable
public bool IsConnected => (_protocol != null);

public string Name => _modeInfo.Name;
public string Symbol => _modeInfo.Symbol;

public static Mode Create(IPoweredUpProtocol protocol, byte hubId, byte portId, byte modeIndex, IObservable<PortValueData> modeValueObservable)
{
Expand Down
8 changes: 3 additions & 5 deletions src/SharpBrick.PoweredUp/Hubs/Hub.cs
Original file line number Diff line number Diff line change
Expand Up @@ -23,20 +23,18 @@ public abstract partial class Hub : IDisposable
public Hub(byte hubId, IServiceProvider serviceProvider, Port[] knownPorts)
{
HubId = hubId;
ServiceProvider = serviceProvider;
ServiceProvider = serviceProvider ?? throw new ArgumentNullException(nameof(serviceProvider));
AddKnownPorts(knownPorts ?? throw new ArgumentNullException(nameof(knownPorts)));
_logger = serviceProvider.GetService<ILoggerFactory>().CreateLogger<Hub>();

}

public void ConnectWithBluetoothAdapter(IPoweredUpBluetoothAdapter poweredUpBluetoothAdapter, ulong bluetoothAddress)
{
var loggerFactory = ServiceProvider.GetService<ILoggerFactory>();

_logger?.LogDebug("Init Hub with BluetoothKernel");
var kernel = new BluetoothKernel(poweredUpBluetoothAdapter, bluetoothAddress, loggerFactory.CreateLogger<BluetoothKernel>());
var kernel = ActivatorUtilities.CreateInstance<BluetoothKernel>(ServiceProvider, poweredUpBluetoothAdapter, bluetoothAddress);
_logger?.LogDebug("Init Hub with PoweredUpProtocol");
Protocol = new PoweredUpProtocol(kernel, ServiceProvider);
Protocol = ActivatorUtilities.CreateInstance<PoweredUpProtocol>(ServiceProvider, kernel);

SetupOnHubChange();
SetupOnPortChangeObservable(Protocol.UpstreamMessages);
Expand Down
14 changes: 11 additions & 3 deletions src/SharpBrick.PoweredUp/Hubs/HubFactory.cs
Original file line number Diff line number Diff line change
@@ -1,14 +1,22 @@
using System;
using Microsoft.Extensions.DependencyInjection;
using SharpBrick.PoweredUp.Bluetooth;

namespace SharpBrick.PoweredUp.Hubs
{
public static class HubFactory
public class HubFactory : IHubFactory
{
internal static Hub CreateByBluetoothManufacturerData(byte[] manufacturerData, IServiceProvider serviceProvider)
private readonly IServiceProvider _serviceProvider;

public HubFactory(IServiceProvider serviceProvider)
{
_serviceProvider = serviceProvider ?? throw new ArgumentNullException(nameof(serviceProvider));
}

public Hub CreateByBluetoothManufacturerData(byte[] manufacturerData, IServiceProvider serviceProvider)
=> (manufacturerData == null || manufacturerData.Length < 3) ? null : (PoweredUpHubManufacturerData)manufacturerData[1] switch
{
PoweredUpHubManufacturerData.TechnicMediumHub => new TechnicMediumHub(0x00, serviceProvider),
PoweredUpHubManufacturerData.TechnicMediumHub => ActivatorUtilities.CreateInstance<TechnicMediumHub>(_serviceProvider, (byte)0x00),
_ => throw new NotSupportedException($"Hub with type {(PoweredUpHubManufacturerData)manufacturerData[1]} not yet supported."),
};

Expand Down
9 changes: 9 additions & 0 deletions src/SharpBrick.PoweredUp/Hubs/IHubFactory.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
using System;

namespace SharpBrick.PoweredUp.Hubs
{
public interface IHubFactory
{
Hub CreateByBluetoothManufacturerData(byte[] manufacturerData, IServiceProvider serviceProvider);
}
}
5 changes: 4 additions & 1 deletion src/SharpBrick.PoweredUp/IServiceCollectionExtensions.cs
Original file line number Diff line number Diff line change
@@ -1,12 +1,15 @@
using Microsoft.Extensions.DependencyInjection;
using SharpBrick.PoweredUp.Devices;
using SharpBrick.PoweredUp.Hubs;

namespace SharpBrick.PoweredUp
{
public static class IServiceCollectionExtensions
{
public static IServiceCollection AddPoweredUp(this IServiceCollection self)
=> self
.AddSingleton<IDeviceFactory, DeviceFactory>();
.AddSingleton<IHubFactory, HubFactory>()
.AddSingleton<IDeviceFactory, DeviceFactory>()
.AddSingleton<PoweredUpHost>();
}
}
5 changes: 3 additions & 2 deletions src/SharpBrick.PoweredUp/PoweredUpHost.cs
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ public class PoweredUpHost
private readonly IPoweredUpBluetoothAdapter _bluetoothAdapter;
public IServiceProvider ServiceProvider { get; }
private readonly ILogger<PoweredUpHost> _logger;

private readonly IHubFactory _hubFactory;
private ConcurrentDictionary<ulong, Hub> _hubs = new ConcurrentDictionary<ulong, Hub>();

public IEnumerable<Hub> Hubs => _hubs.Values;
Expand All @@ -26,6 +26,7 @@ public PoweredUpHost(IPoweredUpBluetoothAdapter bluetoothAdapter, IServiceProvid
_bluetoothAdapter = bluetoothAdapter;
ServiceProvider = serviceProvider;
_logger = serviceProvider.GetService<ILoggerFactory>().CreateLogger<PoweredUpHost>();
_hubFactory = serviceProvider.GetService<IHubFactory>();
}

//ctr with auto-finding bt adapter
Expand All @@ -45,7 +46,7 @@ public void Discover(Func<Hub, Task> onDiscovery, CancellationToken token = defa
{
if (!_hubs.ContainsKey(deviceInfo.BluetoothAddress))
{
var hub = HubFactory.CreateByBluetoothManufacturerData(deviceInfo.ManufacturerData, ServiceProvider);
var hub = _hubFactory.CreateByBluetoothManufacturerData(deviceInfo.ManufacturerData, ServiceProvider);
hub.ConnectWithBluetoothAdapter(_bluetoothAdapter, deviceInfo.BluetoothAddress);
_hubs.TryAdd(deviceInfo.BluetoothAddress, hub);
Expand Down

0 comments on commit c588e93

Please sign in to comment.