[英]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.