L'accès ASP.NET Core DI Conteneur De Statique de la Classe Factory

J'ai créé un ASP.NET Core, MVC/WebApi site qui a un RabbitMQ abonné basé sur James Encore l'article du blog de Dans le Monde réel PubSub de Messagerie avec RabbitMQ.

Dans son article, il utilise une classe statique pour démarrer la file d'attente de l'abonné et de définir le gestionnaire d'événement pour en file d'attente des événements. Cette méthode statique instancie ensuite le gestionnaire d'événement par le biais des classes statiques usine de classe.

using RabbitMQ.Client;
using RabbitMQ.Client.Events;
using System;
using System.Text;
namespace NST.Web.MessageProcessing
{
public static class MessageListener
{
private static IConnection _connection;
private static IModel _channel;
public static void Start(string hostName, string userName, string password, int port)
{
var factory = new ConnectionFactory
{
HostName = hostName,
Port = port,
UserName = userName,
Password = password,
VirtualHost = "/",
AutomaticRecoveryEnabled = true,
NetworkRecoveryInterval = TimeSpan.FromSeconds(15)
};
_connection = factory.CreateConnection();
_channel = _connection.CreateModel();
_channel.ExchangeDeclare(exchange: "myExchange", type: "direct", durable: true);
var queueName = "myQueue";
QueueDeclareOk ok = _channel.QueueDeclare(queueName, true, false, false, null);
_channel.QueueBind(queue: queueName, exchange: "myExchange", routingKey: "myRoutingKey");
var consumer = new EventingBasicConsumer(_channel);
consumer.Received += ConsumerOnReceived;
_channel.BasicConsume(queue: queueName, noAck: false, consumer: consumer);
}
public static void Stop()
{
_channel.Close(200, "Goodbye");
_connection.Close();
}
private static void ConsumerOnReceived(object sender, BasicDeliverEventArgs ea)
{
//get the details from the event
var body = ea.Body;
var message = Encoding.UTF8.GetString(body);
var messageType = "endpoint";  //hardcoding the message type while we dev...
//instantiate the appropriate handler based on the message type
IMessageProcessor processor = MessageHandlerFactory.Create(messageType);
processor.Process(message);
//Ack the event on the queue
IBasicConsumer consumer = (IBasicConsumer)sender;
consumer.Model.BasicAck(ea.DeliveryTag, false);
}
}
}

Il fonctionne très bien jusqu'au moment où j'ai maintenant besoin de résoudre un service dans mon message du processeur de l'usine plutôt que de simplement écrire dans la console.

using NST.Web.Services;
using System;
namespace NST.Web.MessageProcessing
{
public static class MessageHandlerFactory
{
public static IMessageProcessor Create(string messageType)
{
switch (messageType.ToLower())
{
case "ipset":
//need to resolve IIpSetService here...
IIpSetService ipService = ???????
return new IpSetMessageProcessor(ipService);
case "endpoint":
//need to resolve IEndpointService here...
IEndpointService epService = ???????
//create new message processor
return new EndpointMessageProcessor(epService);
default:
throw new Exception("Unknown message type");
}
}
}
}

Est-il un moyen d'accéder à la ASP.NET de Base conteneur IoC pour résoudre les dépendances? Je n'ai pas vraiment envie de le mettre en rotation l'ensemble de la pile de dépendances à la main 🙁

Ou, est-il une meilleure façon pour vous abonner à RabbitMQ à partir d'un ASP.NET application de Base? J'ai trouvé RestBus mais cela n'a pas été mis à jour pour la Base 1.x

Pouvez-vous convertir le MessageListener dans une dépendance et de l'injecter partout où vous en avez besoin avec ses propres injection de dépendances?
Je suis curieux, n'a les réponses ci-dessous a aidé?

OriginalL'auteur Nick | 2016-11-15