Поскольку порядок модулей решаются не гарантируется У меня возникли некоторые проблемы, достижение этой цели:Autofac ожидание модуля становится доступным
У меня есть модуль, который регистрирует ScheduleService
этого ScheduleService
отвечает за инициирующие события в наборе интервалы и т. д.
Я могу загрузить в разных IScheduable
элементах, которые я делаю так, используя XML Configuration
. Проблема, которая у меня есть, - это элементы IScheduable
, которые требуют, чтобы IScheduleService
был готов, чтобы он мог зарегистрировать себя.
Так в моем <autofac><modules>
у меня есть
<module type="Namespace.ScheduleServiceModule, Namespace" />
Тогда идея была я мог загрузить как много различных ISchedulable
пунктов
<module type="SomeNamespace.ScheudleItem1, SomeNamespace />
<module type="SomeNamespace.ScheudleItem2, SomeNamespace />
<module type="SomeNamespace.ScheudleItem3, SomeNamespace />
<module type="SomeNamespace.ScheudleItem4, SomeNamespace />
Это в настоящее время, как я это делаю в этих scheduleitem модулей:
protected override void Load(ContainerBuilder builder)
{
builder.RegisterCallback(registry =>
{
var scheduleService = new TypedService(typeof(IScheduleService));
var registrations = registry.RegistrationsFor(scheduleService);
if (registrations != null && registrations.Any())
{
IComponentRegistration componentRegistration = registrations.First();
componentRegistration.Activated += (sender, args) =>
{
IScheduleService scheduleService = args.Instance as IScheduleService;
if (scheduleService != null)
{
OnScheduleServiceAvailable(args.Context, scheduleService);
}
};
}
});
base.Load(builder);
}
Это переопределение в каждом из ScheduleItems
protected override void OnScheduleServiceAvailable(IComponentContext context,
IScheduleService scheduleService)
{
scheduleService.Add(
new SqlSyncSchedulable(Enabled, IntervalMS, ConnectionString, SqlSelect,
context.Resolve<ILoggerService>(),
context.Resolve<IPersonService>(),
context.Resolve<ILoggingEventService>(),
context.Resolve<ITemplateService>(),
context.Resolve<ITemplateLoggingEventService>(),
context.Resolve<IRuntimeSettingsService>()));
}
Который является довольно прерывистым. Элемент ISchedule
должен регистрироваться, но проблема заключается в том, что услуга Schedule
может быть зарегистрирована после этих элементов.
Должен быть способ достичь этого?
Не могли бы вы отредактировать свой вопрос и поделиться своим исходным кодом 'OnScheduleServiceAvailable'? –
Обновлено с помощью OnScheduleServiceAvailable –
Разве вы не можете использовать зависимости на фабриках ('Func')? Чтобы зависимость не требовалась, пока она не будет запрошена. См. [Делегатные заводы] (http://docs.autofac.org/en/latest/advanced/delegate-factories.html) –
wimh