rabbitmq 如何在.net 6中注入事件处理程序依赖项?

ebdffaop  于 2022-11-08  发布在  RabbitMQ
关注(0)|答案(1)|浏览(275)

你好,我正在尝试创建一个连接到RabbitMQ的逻辑,并使用泛型类管理事件。

我的问题继续:我不知道如何注入类NotificationEventHandler

我有三门课:

事件处理程序:

public interface IEventHandler<T>
    where T : class
{
    Task StartListen();
}

EventHandlerBase:(具有主侦听兔子队列)

public abstract class EventHandlerBase<T> : IEventHandler<T>
    where T: class
{
    private readonly IEvent<T> _event;
    private readonly string _queueName;

    #region Event declarate
    public delegate Task EventCallBack<T>(T message);
    public event EventCallBack<T> HandleMessage;
    #endregion

    public EventHandlerBase(IEvent<T> @event)
    {
        _event = @event;
        _queueName = _event.Name;
        this.StartListen();
    }

    public async Task StartListen()
    {
        var consumer = new AsyncEventingBasicConsumer(_event.GetModel());
        consumer.Received += async (ch, ea) =>
        {
            var body = ea.Body.ToArray();
            var text = System.Text.Encoding.UTF8.GetString(body);

            var objectValue = JsonConvert.DeserializeObject<T>(text);
            //Invoke declared event
            HandleMessage?.Invoke(objectValue);

            await Task.CompletedTask;
            _event.GetModel().BasicAck(ea.DeliveryTag, false);
        };

        _event.GetModel().BasicConsume(_queueName, false, "", false, false, null, consumer);
        await Task.CompletedTask;
    }

}

通知事件处理程序:(具有事件处理程序库得具体逻辑与订阅)

public class NotificationEventHandler 
{
    public NotificationEventHandler(EventHandlerBase<NotificationDTO> eventHandler)
    {
        eventHandler.HandleMessage += this.MyHandleMessage;
    }

    public async Task MyHandleMessage(NotificationDTO message)
    {
        Console.WriteLine("Do something...");
    }
}

在**Program.cs:**注入中(我不知道)

builder.Services.AddSingleton<IEventHandler<NotificationDTO>, EventHandlerBase<NotificationDTO>>();

builder.Services.AddSingleton<NotificationEventHandler<NotificationDTO>>(); // ???

NotificationDTO是具有属性的任何类....

cwdobuhd

cwdobuhd1#

如果您希望能够访问NotificationDTO,则必须向NotificationEventHandler添加泛型类型,如下所示:

class NotificationEventHandler<T>
{
    public T Notification { get; set; }
    ...
}

然后,当您像NotificationEventHandler一样调用它时,通知的类型将为NotificationDTO

相关问题