Как передать несколько объектов одного типа в контроллер? - PullRequest
1 голос
/ 30 января 2020

Я хотел бы передать несколько объектов одного типа из автозагрузки в контроллер в ASP. NET Core 3.

Конструктор моего контроллера:

public RenderImageController(CloudQueue startRenderQueue, CloudQueue renderCompletedQueue)
{
    _startRenderQueue = startRenderQueue;
    _renderCompletedQueue = renderCompletedQueue;
}

I попробовал это при запуске:

    services.AddSingleton(typeof(CloudQueue), startRenderQueue);
    services.AddSingleton(typeof(CloudQueue), renderCompletedQueue);

Но это привело к тому, что один и тот же объект (второй) был передан моему контроллеру.

Каков наилучший способ передачи таких объектов моему контроллер

Ответы [ 2 ]

1 голос
/ 30 января 2020

Вы должны создать один класс-оболочку для двух облачных очередей и внедрить его как singleton

    public interface IMyCloudQueueCollection
    {
        CloudQueue StartRenderQueue { get; }

        CloudQueue RenderCompletedQueue { get; }
    }

    public class MyCloudQueueCollection : IMyCloudQueueCollection
    {
        public CloudQueue StartRenderQueue { get; private set; }

        public CloudQueue RenderCompletedQueue { get; private set; }

        public MyCloudQueueCollection(CloudQueue startRenderQueue, CloudQueue renderCompletedQueue)
        {
            this.StartRenderQueue = startRenderQueue;
            this.RenderCompletedQueue = renderCompletedQueue;
        }
    }
     // in startup
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddSingleton<IMyCloudQueueCollection,MyCloudQueueCollection>(s=> new MyCloudQueueCollection(startRenderQueue, renderCompletedQueue))
    } 

     //in controller
     public RenderImageController(IMyCloudQueueCollection queueCollection)
     {
         _startRenderQueue = queueCollection.StartRenderQueue;
         _renderCompletedQueue = queueCollection.RenderCompletedQueue;
     } 
1 голос
/ 30 января 2020

Вставьте IEnumerable<CloudQueue> в конструктор контроллера и извлеките нужный объект

//...

public RenderImageController(IEnumerable<CloudQueue> queues) {    
    _startRenderQueue = queues.FirstOrDefault(queue => queue.Name == "startRenderQueueNameHere");
    _renderCompletedQueue = queues.FirstOrDefault(queue => queue.Name == "renderCompletedQueueNameHere");
}

//...

В то время как в приведенном выше примере использовалась очередь Name для различения guish требуемого объекта, вы можете использовать любое одно или сочетание других свойств очереди для его идентификации.

...