Azure Webjob - 每请求生命周期?

时间:2017-08-16 09:56:09

标签: autofac azure-webjobs

我有一个控制台应用程序,我用于天蓝色的webjob。我需要为每个azure webjob请求提供唯一的nhibernate会话。我使用autofact来管理DI。

如何在azure webjobs中获得Per Request Lifetime实例?固有的控制台应用程序没有这个。我需要更改项目类型吗?

我已经看到了关于如何做类似herehere的几个答案。但它们基本上归结为传递容器作为函数的参数。根据请求,这并不是真正的实例。

1 个答案:

答案 0 :(得分:0)

据我所知,webjob没有请求。它只是作为App Service Web Apps上的后台进程运行程序。它无法获得请求。

在我看来,Per Request Lifetime实例化在Web应用程序中使用,如ASP.NET Web表单和MVC应用程序而非webjobs。

您对该请求的意思是什么?

通常,我们将使用AutofacJobActivator在webjobs中使用Instance Per Dependency。

触发该功能时会自动创建新实例。

这是一个webjob示例:

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();
    }
}

当触发该功能时,它将自动创建新实例。