Веб-задание Azure — время жизни каждого запроса?

У меня есть консольное приложение, которое я использую для лазурного веб-задания. Мне нужно иметь уникальный сеанс nhibernate для каждого запроса веб-задания Azure. Я использую autofact для управления DI.

Как я могу получить экземпляры Per Request Lifetime в лазурных веб-заданиях? По сути консольное приложение не имеет этого. Нужно ли менять типы проектов?

Я видел несколько ответов о том, как сделать что-то подобное здесь и здесь. Но в основном они сводятся к передаче контейнера в качестве параметра функциям. На самом деле это не экземпляр для каждого запроса.


person richard    schedule 16.08.2017    source источник
comment
какой триггер используете??   -  person Thomas    schedule 17.08.2017
comment
триггер очереди Azure   -  person richard    schedule 17.08.2017
comment
очередь или очередь служебной шины? взгляните на этот ответ stackoverflow .com/questions/35186456/ и дайте мне знать :-)   -  person Thomas    schedule 17.08.2017
comment
очередь хранилища Azure.   -  person richard    schedule 17.08.2017
comment
Ха-ха, да, это лучший ответ, который я нашел до сих пор. Переопределение IQueueProcessorFactory. Мы сейчас работаем над этим. Это взлом или такое использование по назначению? Это предназначено для переопределения?   -  person richard    schedule 17.08.2017
comment
Таким образом, IjobActivator позволяет вам вводить зависимости, а IQueueProcessorFactory позволяет вам выполнять некоторую логику, специфичную для сообщения, например, создавать новую область.   -  person Thomas    schedule 18.08.2017


Ответы (1)


Насколько я знаю, у webjob нет запроса. Он просто запускает программы как фоновые процессы в веб-приложениях службы приложений. Не удалось получить запрос.

На мой взгляд, экземпляр Per Request Lifetime используется в веб-приложениях, таких как веб-формы ASP.NET и приложения MVC, а не в веб-заданиях.

Что вы имеете в виду под запросом?

Обычно мы будем использовать Instance Per Dependency в веб-заданиях с помощью AutofacJobActivator.

Он автоматически создаст новый экземпляр при запуске функции.

Вот пример веб-задания:

class Program
{
    // Please set the following connection strings in app.config for this WebJob to run:
    // AzureWebJobsDashboard and AzureWebJobsStorage
    static void Main()
    {
        var builder = new ContainerBuilder();
         builder.Register(c =>
        {
            var model = new DeltaResponse();
            return model;
        })
     .As<IDropboxApi>()
     .SingleInstance();
     builder.RegisterType<Functions>().InstancePerDependency();
        var Container = builder.Build();
        var config = new JobHostConfiguration()
        {
            JobActivator = new AutofacJobActivator(Container)
        };

        var host = new JobHost(config);
        // The following code ensures that the WebJob will be running continuously
        host.RunAndBlock();
    }
}

public class AutofacJobActivator : IJobActivator
{
    private readonly IContainer _container;

    public AutofacJobActivator(IContainer container)
    {
        _container = container;
    }

    public T CreateInstance<T>()
    {
        return _container.Resolve<T>();
    }
}

public interface IDropboxApi
{
    void  GetDelta();
}

public class DeltaResponse : IDropboxApi
{
    public Guid id { get; set; }

    public DeltaResponse()
    {
        id = Guid.NewGuid();
    }
    void IDropboxApi.GetDelta()
    {
        Console.WriteLine(id);
        //throw new NotImplementedException();
    }
}

Функции.cs:

public class Functions
{
    // This function will get triggered/executed when a new message is written 
    // on an Azure Queue called queue.

    private readonly IDropboxApi _dropboxApi;

    public Functions(IDropboxApi dropboxApi)
    {
        _dropboxApi = dropboxApi;
    }


    public void ProcessQueueMessage([QueueTrigger("queue")] string message, TextWriter log)
    {
        log.WriteLine("started");

        // Define request parameters.
        _dropboxApi.GetDelta();
    }
}

Когда функция сработает, она автоматически создаст новый экземпляр.

person Brando Zhang    schedule 17.08.2017