我有一个控制台应用程序,我用于天蓝色的webjob。我需要为每个azure webjob请求提供唯一的nhibernate会话。我使用autofact来管理DI。
如何在azure webjobs中获得Per Request Lifetime实例?固有的控制台应用程序没有这个。我需要更改项目类型吗?
我已经看到了关于如何做类似here和here的几个答案。但它们基本上归结为传递容器作为函数的参数。根据请求,这并不是真正的实例。
答案 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();
}
}
当触发该功能时,它将自动创建新实例。