簡體   English   中英

從 Ioc 獲取泛型類型的實例而無需 Type

[英]Get instance of generic type from Ioc without having the Type

我試圖想辦法如何在 .net 核心不使用類型的默認 IoC 容器上獲取注冊實例。

這是什么工作如下。

我使用 rabbitMQ 並有一個生產者和一個消費者。 我公開了一種發布消息的方法,

發布方法體

        IBasicProperties basicProperties = _channel.CreateBasicProperties();

        if (setup is null)
        {
            setup = (props) =>
            {
                props.Persistent = true;
                props.Type = $"{typeof(TMessage).AssemblyQualifiedName}.{typeof(TMessage).FullName}";
            };
        }

        setup(basicProperties);

        _channel.BasicPublish(exchange, string.Empty, basicProperties, ConvertMessageToByteArray(message)); 

用於序列化消息的方法。

    private byte[] ConvertMessageToByteArray<TMessage>(TMessage message)
        where TMessage : IMessage
    {
        string messageAsJson = JsonConvert.SerializeObject(message, _mqBuilder.JsonSettings);

        return Encoding.UTF8.GetBytes(messageAsJson);
    }

我想使用它,我可以這樣做,但是我想將傳入的消息(序列化形式)與在消費者(客戶端)上注冊的類型的注冊消息處理程序匹配

interface IAsyncMessageHandler<T> 
{
   Task<Response> ConsumeAsync(T message)
}

這是設置,我實際上被卡住了,不知道如何從 IoC 獲取 IAsyncMessageHandler<> 類型的注冊實例並匹配它。

        AsyncEventingBasicConsumer asyncConsumer = new AsyncEventingBasicConsumer(_channel);

        asyncConsumer.Received += async (sender, @event) =>
        {
            try
            {
                byte[] bodyAsBytes = @event.Body.ToArray();

                string messageAsJson= Encoding.UTF8.GetString(bodyAsBytes);

                object message = JsonConvert.DeserializeObject(messageAsJson);

                string messageType = @event.BasicProperties.Type;

                using (IServiceScope serviceScope = _serviceProvider.CreateScope())
                {
                   ///// ..... ??????? 
                    var @object2 = serviceScope.ServiceProvider.GetService(typeof(IAsyncMessageHandler<>));


                    //Response response = await object2 .ConsumeAsync(message);

                    //if (!response.Success) ack = false;
                }

                await Task.CompletedTask;
            }

            catch
            {
                ack = false;
            }

            finally
            {
                if (ack) _channel.BasicAck(@event.DeliveryTag, false);
            }
        };

你將無法做到這一點。 從實現的角度來看,您要查找哪個IAsyncMessageHandler 如果您有 10 個具有不同T的處理程序,您想將消息發送到哪一個? 而是將您的界面更改為以下內容:

interface IAsyncMessageHandler 
{
   Task<Response> ConsumeAsync(byte[] message);
}

然后你可以做類似的事情

byte[] bodyAsBytes = @event.Body.ToArray();
using (IServiceScope serviceScope = _serviceProvider.CreateScope())
{
    var @object2 = serviceScope.ServiceProvider.GetService<IAsyncMessageHandler>();

    Response response = await @object2.ConsumeAsync(bodyAsBytes);

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM