ASP.NET Core 中 Redis 频道的订阅方法
Subscribe methods for channels in Redis in ASP.NET Core
我尝试使用 StackExchange.Redis 作为消息代理。它工作正常,但我现在有一个缺点。我需要 MQ 来沟通 2 ASP.NET 个核心项目。
ConnectionMultiplexer
有一个 Subscriber
方法,该方法将相同的 Action 委托订阅到 MQ。有没有办法不通过 Startup
class?
首先,我试图借助属性 class 实现这一点,代码如
public class FireAndForgetAttribute<T> : Attribute
{
public FireAndForgetAttribute(IConnectionMultiplexer plexer, string channelName, Action<T> reaction)
{
var subscriber = plexer.GetSubscriber();
subscriber.Subscribe(channelName, (channel, message) =>
{
var data = JsonConvert.Deserialize<T>(message);
reaction.Invoke(data);
}, flags: CommandFlags.FireAndForget);
}
}
但这不是一个好方法,因为在 C# 中仍然没有通用属性(只是在标记为讨论的路线图中,没有别的),而且我不能在这里传递具体对象的 Action<T>
。
P.P.S。对不起,我忘了改变我的问题。现在是正确的。
我做的,那是很久以前的事了,使用Nancy、EasyQ和DryIOC
不是基于属性而是类
将注册 IPipeline
的所有具体类的辅助方法
RegisterMultipleTypesToContainer(container, typeof(IPipeline));
我想这就是 Scutor 所做的,但当时没有 scutor 所以必须使用 Reflection,然后订阅....
private void RegisterMultipleTypesToContainer(IContainer container, Type type)
{
var allTypes = AppDomain.CurrentDomain.GetAssemblies()
.Where(x =>
x.FullName.StartsWith("MyAssembly", StringComparison.Ordinal))SelectMany(x => x.GetTypes());
var types = allTypes.Where(x => type.IsAssignableFrom(x) && x.IsClass && !x.IsAbstract).ToList();
foreach (var concreteTypes in types)
{
var genericTypes = concreteTypes.GetInterfaces().Where(x => x != type).ToList();
foreach (var genericType in genericTypes)
{
container.Register(genericType, concreteTypes, Reuse.Singleton);
var pipeline = container.Resolve(genericType) as IPipeline;
pipeline.Subscribe();
}
}
}
public class HelloPipeline :
BasePipeline<HelloPipeline.Message>
{
IBusService _bus;
HelloPipeline(IBusService bus){
_bus = bus;
}
private Task ExecuteAsync(String channel, ) { }
public void Subscribe()
{
_bus.SubscribeAsync<T>(this.GetType().Name, this.ExecuteAsync);
}
}
刚刚检查了旧代码但仍然有效,希望它能给你一个想法,但我认为你想要实现的目标与我所做的相同,但使用了其他工具
我尝试使用 StackExchange.Redis 作为消息代理。它工作正常,但我现在有一个缺点。我需要 MQ 来沟通 2 ASP.NET 个核心项目。
ConnectionMultiplexer
有一个 Subscriber
方法,该方法将相同的 Action 委托订阅到 MQ。有没有办法不通过 Startup
class?
首先,我试图借助属性 class 实现这一点,代码如
public class FireAndForgetAttribute<T> : Attribute
{
public FireAndForgetAttribute(IConnectionMultiplexer plexer, string channelName, Action<T> reaction)
{
var subscriber = plexer.GetSubscriber();
subscriber.Subscribe(channelName, (channel, message) =>
{
var data = JsonConvert.Deserialize<T>(message);
reaction.Invoke(data);
}, flags: CommandFlags.FireAndForget);
}
}
但这不是一个好方法,因为在 C# 中仍然没有通用属性(只是在标记为讨论的路线图中,没有别的),而且我不能在这里传递具体对象的 Action<T>
。
P.P.S。对不起,我忘了改变我的问题。现在是正确的。
我做的,那是很久以前的事了,使用Nancy、EasyQ和DryIOC
不是基于属性而是类
将注册 IPipeline
RegisterMultipleTypesToContainer(container, typeof(IPipeline));
我想这就是 Scutor 所做的,但当时没有 scutor 所以必须使用 Reflection,然后订阅....
private void RegisterMultipleTypesToContainer(IContainer container, Type type)
{
var allTypes = AppDomain.CurrentDomain.GetAssemblies()
.Where(x =>
x.FullName.StartsWith("MyAssembly", StringComparison.Ordinal))SelectMany(x => x.GetTypes());
var types = allTypes.Where(x => type.IsAssignableFrom(x) && x.IsClass && !x.IsAbstract).ToList();
foreach (var concreteTypes in types)
{
var genericTypes = concreteTypes.GetInterfaces().Where(x => x != type).ToList();
foreach (var genericType in genericTypes)
{
container.Register(genericType, concreteTypes, Reuse.Singleton);
var pipeline = container.Resolve(genericType) as IPipeline;
pipeline.Subscribe();
}
}
}
public class HelloPipeline :
BasePipeline<HelloPipeline.Message>
{
IBusService _bus;
HelloPipeline(IBusService bus){
_bus = bus;
}
private Task ExecuteAsync(String channel, ) { }
public void Subscribe()
{
_bus.SubscribeAsync<T>(this.GetType().Name, this.ExecuteAsync);
}
}
刚刚检查了旧代码但仍然有效,希望它能给你一个想法,但我认为你想要实现的目标与我所做的相同,但使用了其他工具