title: Accessing ASP.NET Core DI Container From Static Factory Class
body: <p>I've created an ASP.NET Core MVC/WebApi site that has a RabbitMQ subscriber based off James Still's blog article <a href="http://www.squarewidget.com/real-world-pubsub-messaging-with-rabbitmq" rel="noreferrer">Real-World PubSub Messaging with RabbitMQ</a>.</p>
  
  <p>In his article he uses a static class to start the queue subscriber and define the event handler for queued events.  This static method then instantiates the event handler classes via a static factory class.</p>
  
  <pre><code>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);
          }
  
      }
  }
  </code></pre>
  
  <p>It works great up to the point where I now need to resolve a service in my message processor factory rather than just write to the console.</p>
  
  <pre><code>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");
              }
          }
      }
  }
  </code></pre>
  
  <p>Is there any way to access the ASP.NET Core IoC container to resolve the dependencies?  I don't really want to have to spin up the whole stack of dependencies by hand  :(</p>
  
  <p>Or, is there a better way to subscribe to RabbitMQ from an ASP.NET Core application?  I found <a href="http://restbus.org/" rel="noreferrer">RestBus</a> but it's not been updated for Core 1.x</p>