-
Notifications
You must be signed in to change notification settings - Fork 4
/
RedisRegistry.cs
94 lines (78 loc) · 2.9 KB
/
RedisRegistry.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
using System;
using Hangfire.Redis.StackExchange;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options;
using Miru.Queuing;
using Miru.Security;
using StackExchange.Redis;
namespace Miru.Redis;
public static class RedisRegistry
{
// public static IServiceCollection AddRedisQueueing<TAuthorizer>(
// this IServiceCollection services,
// Action<QueuingBuilder> queuingBuilder = null)
// where TAuthorizer : class, IQueueAuthorizer
// {
// services.AddQueuing(x =>
// {
// x.UseRedis();
//
// queuingBuilder?.Invoke(x);
// });
//
// services.AddScoped<IQueueAuthorizer, TAuthorizer>();
//
// services.AddQueueCleaner<RedisQueueCleaner>();
//
// services.AddSingleton(sp => sp.GetRequiredService<IOptions<QueueingOptions>>().Value);
//
// services.AddSingleton(sp =>
// {
// var configuration = sp.GetService<IConfiguration>();
//
// var connectionString = configuration.GetValue<string>("Queueing:ConnectionString");
//
// return ConnectionMultiplexer.Connect(connectionString);
// });
//
// return services;
// }
public static void UseRedis(
this QueuingBuilder builder,
Action<RedisStorageOptions> storage = null)
{
var sp = builder.ServiceProvider;
var redisConnection = sp.GetRequiredService<ConnectionMultiplexer>();
var queueingOptions = sp.GetRequiredService<QueueingOptions>();
var storageOptions = new RedisStorageOptions
{
// hangfire key will be => {prefix}:job:*
Prefix = $"{queueingOptions.Prefix}:"
};
storage?.Invoke(storageOptions);
builder.Configuration.UseRedisStorage(redisConnection, storageOptions);
}
public static IServiceCollection AddRedisQueueing<TAuthorizer>(
this IServiceCollection services,
Action<QueuingBuilder> queuingBuilder = null,
Action<RedisStorageOptions> storage = null)
where TAuthorizer : class, IQueueAuthorizer
{
services.AddQueuing(x =>
{
x.UseRedis(storage);
queuingBuilder?.Invoke(x);
});
services.AddScoped<IQueueAuthorizer, TAuthorizer>();
services.AddQueueCleaner<RedisQueueCleaner>();
services.AddSingleton(sp => sp.GetRequiredService<IOptions<QueueingOptions>>().Value);
services.AddSingleton(sp =>
{
var configuration = sp.GetService<IConfiguration>();
var connectionString = configuration.GetValue<string>("Queueing:ConnectionString");
return ConnectionMultiplexer.Connect(connectionString);
});
return services;
}
}