Skip to content

Commit 0102d0b

Browse files
committed
Add IPushSubscriptionStoreAccessor (#9)
1 parent a5db253 commit 0102d0b

8 files changed

Lines changed: 92 additions & 12 deletions

File tree

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
using System;
2+
3+
namespace Demo.AspNetCore.PushNotifications.Services.Abstractions
4+
{
5+
public interface IPushSubscriptionStoreAccessor : IDisposable
6+
{
7+
IPushSubscriptionStore PushSubscriptionStore { get; }
8+
}
9+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
namespace Demo.AspNetCore.PushNotifications.Services.Abstractions
2+
{
3+
public interface IPushSubscriptionStoreAccessorProvider
4+
{
5+
IPushSubscriptionStoreAccessor GetPushSubscriptionStoreAccessor();
6+
}
7+
}

Demo.AspNetCore.PushNotifications.Services.Sqlite/Demo.AspNetCore.PushNotifications.Services.Sqlite.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
</PropertyGroup>
55
<ItemGroup>
66
<PackageReference Include="Lib.Net.Http.WebPush" Version="2.0.0" />
7+
<PackageReference Include="Microsoft.AspNetCore.Http" Version="2.2.0" />
78
<PackageReference Include="Microsoft.AspNetCore.Http.Abstractions" Version="2.2.0" />
89
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="2.2.0" />
910
</ItemGroup>
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
using Microsoft.Extensions.DependencyInjection;
2+
using Demo.AspNetCore.PushNotifications.Services.Abstractions;
3+
4+
namespace Demo.AspNetCore.PushNotifications.Services.Sqlite
5+
{
6+
internal class SqlitePushSubscriptionStoreAccessor : IPushSubscriptionStoreAccessor
7+
{
8+
private IServiceScope _serviceScope;
9+
10+
public IPushSubscriptionStore PushSubscriptionStore { get; private set; }
11+
12+
public SqlitePushSubscriptionStoreAccessor(IPushSubscriptionStore pushSubscriptionStore)
13+
{
14+
PushSubscriptionStore = pushSubscriptionStore;
15+
}
16+
17+
public SqlitePushSubscriptionStoreAccessor(IServiceScope serviceScope)
18+
{
19+
_serviceScope = serviceScope;
20+
PushSubscriptionStore = _serviceScope.ServiceProvider.GetService<IPushSubscriptionStore>();
21+
}
22+
23+
public void Dispose()
24+
{
25+
PushSubscriptionStore = null;
26+
27+
if (!(_serviceScope is null))
28+
{
29+
_serviceScope.Dispose();
30+
_serviceScope = null;
31+
}
32+
}
33+
}
34+
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
using System;
2+
using Microsoft.AspNetCore.Http;
3+
using Microsoft.Extensions.DependencyInjection;
4+
using Demo.AspNetCore.PushNotifications.Services.Abstractions;
5+
6+
namespace Demo.AspNetCore.PushNotifications.Services.Sqlite
7+
{
8+
internal class SqlitePushSubscriptionStoreAccessorProvider : IPushSubscriptionStoreAccessorProvider
9+
{
10+
private readonly IHttpContextAccessor _httpContextAccessor;
11+
private readonly IServiceProvider _serviceProvider;
12+
13+
public SqlitePushSubscriptionStoreAccessorProvider(IHttpContextAccessor httpContextAccessor, IServiceProvider serviceProvider)
14+
{
15+
_httpContextAccessor = httpContextAccessor;
16+
_serviceProvider = serviceProvider;
17+
}
18+
19+
public IPushSubscriptionStoreAccessor GetPushSubscriptionStoreAccessor()
20+
{
21+
if (_httpContextAccessor.HttpContext is null)
22+
{
23+
return new SqlitePushSubscriptionStoreAccessor(_serviceProvider.CreateScope());
24+
}
25+
else
26+
{
27+
return new SqlitePushSubscriptionStoreAccessor(_httpContextAccessor.HttpContext.RequestServices.GetRequiredService<IPushSubscriptionStore>());
28+
}
29+
}
30+
}
31+
}

Demo.AspNetCore.PushNotifications.Services.Sqlite/SqliteServiceCollectionExtensions.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@ public static IServiceCollection AddSqlitePushSubscriptionStore(this IServiceCol
1616
);
1717

1818
services.AddTransient<IPushSubscriptionStore, SqlitePushSubscriptionStore>();
19+
services.AddHttpContextAccessor();
20+
services.AddSingleton<IPushSubscriptionStoreAccessorProvider, SqlitePushSubscriptionStoreAccessorProvider>();
1921

2022
return services;
2123
}

Demo.AspNetCore.PushNotifications.Services/PushNotificationsDequeuer.cs

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,23 @@
1-
using System;
2-
using System.Threading;
1+
using System.Threading;
32
using System.Threading.Tasks;
43
using Microsoft.Extensions.Hosting;
5-
using Microsoft.Extensions.DependencyInjection;
64
using Lib.Net.Http.WebPush;
75
using Demo.AspNetCore.PushNotifications.Services.Abstractions;
86

97
namespace Demo.AspNetCore.PushNotifications.Services
108
{
119
internal class PushNotificationsDequeuer : IHostedService
1210
{
13-
private readonly IServiceProvider _serviceProvider;
11+
private readonly IPushSubscriptionStoreAccessorProvider _subscriptionStoreAccessorProvider;
1412
private readonly IPushNotificationsQueue _messagesQueue;
1513
private readonly IPushNotificationService _notificationService;
1614
private readonly CancellationTokenSource _stopTokenSource = new CancellationTokenSource();
1715

1816
private Task _dequeueMessagesTask;
1917

20-
public PushNotificationsDequeuer(IServiceProvider serviceProvider, IPushNotificationsQueue messagesQueue, IPushNotificationService notificationService)
18+
public PushNotificationsDequeuer(IPushNotificationsQueue messagesQueue, IPushSubscriptionStoreAccessorProvider subscriptionStoreAccessorProvider, IPushNotificationService notificationService)
2119
{
22-
_serviceProvider = serviceProvider;
20+
_subscriptionStoreAccessorProvider = subscriptionStoreAccessorProvider;
2321
_messagesQueue = messagesQueue;
2422
_notificationService = notificationService;
2523
}
@@ -46,11 +44,9 @@ private async Task DequeueMessagesAsync()
4644

4745
if (!_stopTokenSource.IsCancellationRequested)
4846
{
49-
using (IServiceScope serviceScope = _serviceProvider.CreateScope())
47+
using (IPushSubscriptionStoreAccessor subscriptionStoreAccessor = _subscriptionStoreAccessorProvider.GetPushSubscriptionStoreAccessor())
5048
{
51-
IPushSubscriptionStore subscriptionStore = serviceScope.ServiceProvider.GetRequiredService<IPushSubscriptionStore>();
52-
53-
await subscriptionStore.ForEachSubscriptionAsync((PushSubscription subscription) =>
49+
await subscriptionStoreAccessor.PushSubscriptionStore.ForEachSubscriptionAsync((PushSubscription subscription) =>
5450
{
5551
// Fire-and-forget
5652
_notificationService.SendNotificationAsync(subscription, message, _stopTokenSource.Token);

Demo.AspNetCore.PushNotifications/appsettings.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
"PushNotificationServiceType": "PushService",
66
"PushNotificationService": {
77
"Subject": "https://localhost:65506/",
8-
"PublicKey": "<Application Server Public Key>",
9-
"PrivateKey": "<Application Server Private Key>"
8+
"PublicKey": "BK5sn4jfa0Jqo9MhV01oyzK2FaEHm0KqkSCuUkKr53-9cr-vBE1a9TiiBaWy7hy0eOUF1jhZnwcd3vof4wnwSw0",
9+
"PrivateKey": "AJ2ho7or-6D4StPktpTO3l1ErjHGyxb0jzt9Y8lj67g"
1010
}
1111
}

0 commit comments

Comments
 (0)