Perché l'ordine dei moduli in via di risoluzione non è garantito che sto avendo qualche problema raggiungimento di questo:Autofac attesa per il modulo per diventare disponibile
ho un modulo che registri un ScheduleService
questo ScheduleService
è responsabile per gli eventi di trigger a set intervalli ecc.
Sono in grado di caricare diversi IScheduable
elementi che lo fanno utilizzando il XML Configuration
. Il problema che ho, è che gli articoli IScheduable
richiedono che lo IScheduleService
sia pronto in modo che possa registrarsi da solo.
Così nel mio <autofac><modules>
ho
<module type="Namespace.ScheduleServiceModule, Namespace" />
Poi l'idea mi è stato in grado di caricare in altrettante differenti ISchedulable
articoli
<module type="SomeNamespace.ScheudleItem1, SomeNamespace />
<module type="SomeNamespace.ScheudleItem2, SomeNamespace />
<module type="SomeNamespace.ScheudleItem3, SomeNamespace />
<module type="SomeNamespace.ScheudleItem4, SomeNamespace />
Questo è attualmente come lo faccio in quei moduli 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);
}
Questo è l'override in ciascuno di 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>()));
}
Che è abbastanza intermittente. L'elemento ISchedule
dovrebbe registrarsi ma il problema è che il servizio potrebbe essere registrato dopo tali elementi.
Ci deve essere un modo per raggiungere questo obiettivo?
Potresti modificare la tua domanda e condividere il tuo codice sorgente "OnScheduleServiceAvailable'? –
Aggiornato con OnScheduleServiceAvailable –
Non è possibile utilizzare dipendenze su fabbriche ('Func')? Che la dipendenza non ha bisogno di essere disponibile fino a quando non viene richiesto. Vedi [Delegate Factories] (http://docs.autofac.org/en/latest/advanced/delegate-factories.html) –
wimh