Azure Webjob – Доживотна заявка?

Имам конзолно приложение, което използвам за уеб работа в Azure. Трябва да имам уникална сесия на nhibernate за заявка за уеб работа в azure. Използвам autofact за управление на DI.

Как мога да получа доживотно инстанциране на заявка в azure webjobs? По същество конзолното приложение няма това. Трябва ли да променя типовете проекти?

Виждал съм няколко отговора как да направя нещо подобно тук и тук. Но те основно се свеждат до предаване в контейнер като параметър на функции. Това всъщност не е екземпляр на заявка.


person richard    schedule 16.08.2017    source източник
comment
какъв тип тригер използвате??   -  person Thomas    schedule 17.08.2017
comment
задействане на лазурна опашка   -  person richard    schedule 17.08.2017
comment
опашка или servicebus опашка? погледнете този отговор 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 няма заявката. Той просто изпълнява програми като фонови процеси в App Service Web Apps. Не можа да получи заявката.

По мое мнение инстанцирането на Per Request Lifetime се използва в уеб приложения като ASP.NET уеб формуляри и MVC приложения, а не уеб задания.

Какво имаш предвид с молбата?

Обикновено ще използваме екземпляра за зависимост в уеб задачите, като използваме 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();
    }
}

Functions.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