为了账号安全,请及时绑定邮箱和手机立即绑定

ASP.NET Core 中 Redis 中频道的订阅方法

ASP.NET Core 中 Redis 中频道的订阅方法

C#
精慕HU 2023-09-24 10:55:45
我尝试使用 StackExchange.Redis 作为消息代理。它工作得很好,但我现在有一个缺点。我需要 MQ 来通信 2 个 ASP.NET Core 项目。 ConnectionMultiplexer有一个Subscriber方法将相同的 Action 委托订阅到 MQ。有什么办法可以不通过Startup课堂来做到这一点吗?首先,我尝试借助属性类来实现这一点,代码如下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>具体对象。PPS 抱歉,我忘了改变我的问题的主题。现在是正确的了。
查看完整描述

1 回答

?
子衿沉夜

TA贡献1828条经验 获得超3个赞

我这样做了,那是很久以前的事了,使用 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);

        }

    }


刚刚检查了旧代码,但仍然有效,希望它能给您一个想法,但我认为您想要实现的目标与我所做的相同,但使用其他工具


查看完整回答
反对 回复 2023-09-24
  • 1 回答
  • 0 关注
  • 81 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信