У меня есть несколько заданий пакетного задания для запуска, и мне было предложено иметь один webJob для запуска всей задачи, которые мне нужно планировать для запуска в разное время.Azure WebJobs - многократная фоновая задача в одиночных ошибках WebJob и Ef Была сделана попытка использовать контекст во время его настройки
Я использовал функцию таймера из webJob.Extensions.
т.е. в Program.cs
var config = new JobHostConfiguration
{
JobActivator = new AutofacActivator(ContainerConfig<Functions>.GetContainer())
};
if (config.IsDevelopment)
{
config.UseDevelopmentSettings();
}
config.UseTimers();
var host = new JobHost(config);
host.RunAndBlock();
и функция будет иметь несколько метод и срабатывают в интервале 30 мин.
public void ProcessMethod1([TimerTrigger("0 0/30 * * * *")] TimerInfo timer)
{
//Logic
}
public void ProcessMethod2([TimerTrigger("0 0/30 * * * *")] TimerInfo timer)
{
//Logic
}
Выпуск: Поскольку я использую Autofac DI. Я создаю экземпляр для DbContext в начале задания
JobActivator = new AutofacActivator(ContainerConfig<Functions>.GetContainer())
При выполнении webJob я получаю ошибки при выполнении DB выбрать как «была сделана попытка использовать контекст во время его сконфигурировано».
Так как я дал scope как InstancePerLifetimeScope(). Я хочу знать, получит ли операция Two тот же самый экземпляр?
Также для ведения журнала у меня есть аналогичная проблема, так как похоже, что для этих двух разных операций создается только один экземпляр.
Все, что я хочу, это отдельный экземпляр для DBCOntext и Logger на основе операции. Pls советует мне, как я могу установить DI для этого сценария.
Update:
public class AutofacActivator: IJobActivator
{
private readonly Autofac.IContainer _container;
public AutofacActivator(Autofac.IContainer container)
{
_container = container;
}
public T CreateInstance<T>()
{
return _container.Resolve<T>();
}
}
internal class WebJobIocModule<T> : Autofac.Module
{
protected override void Load(ContainerBuilder builder)
{
if (builder == null)
throw new ArgumentNullException("WebJobBuilder");
//Cascade
builder.RegisterModule(new BusinessObjectIocModule());
// Register the functions class - WebJobs will discover our triggers this way
builder.RegisterType<T>();
}
}
public class BusinessObjectIocModule :Autofac.Module
{
protected override void Load(ContainerBuilder builder)
{
if(builder == null) throw new ArgumentNullException("BusinessObjectBuilder");
//Cascade
builder.RegisterModule(new DataAccessRepoIocModule());
builder.RegisterType<BusinessObjBpc>().AsImplementedInterfaces();
}
}
В DataAccessIOC:
string connectionString = ConfigurationManager.ConnectionStrings["DBConnectionAppKeyName"].ConnectionString;
optionsStagingBuilder.UseSqlServer(connectionString);
builder.RegisterType<DataAccessDbContext>()
.AsSelf()
.WithParameter("options", optionsStagingBuilder.Options)
.InstancePerLifetimeScope();
вы можете разместить код AutofacActivator, код, который показывает, как вы зарегистрировали зависимости, а также коды класса, который инкапсулирует свои рабочие функции. Спасибо – Thomas
Чтобы проверить, используете ли вы один и тот же экземпляр 'DbContext' в разных местах, вы можете пометить свой экземпляр DbContext уникальным значением и зарегистрировать его/проверить его при отладке. Добавьте свойство в свой 'DbContext' и заполните его новым Guid в конструкторе или что-то подобное. [Как упоминалось здесь] (https://github.com/aspnet/EntityFramework/issues/6488) – Diana
@Thomas Спасибо .. Я рад найти код контейнера – RajGan