Я имею микросервис ядра .net, который нацелен на .net 4.6.2.Я играю с событиями домена.Моя текущая инфраструктура событий домена основана на этом коде:
public interface IDomainEvent
{
}
public class DomainEvent<TE>
where TE : IDomainEvent
{
private static readonly List<Delegate> actions = new List<Delegate>();
public virtual void Register(Action<TE> callback)
{
DomainEvent<TE>.actions.Add((Delegate)callback);
}
public virtual void Raise(TE evnt)
{
foreach (Action<TE> action in DomainEvent<TE>.actions.ToArray())
action(evnt);
}
}
public class ExportFinished : IDomainEvent
{
public ExportFinished(FinishedJob finishedJob)
{
FinishedJob = finishedJob;
}
public FinishedJob FinishedJob { get; protected set; }
}
// Domain events
public static class DomainEvents
{
public static DomainEvent<ExportFinished> ExportFinished
{
get
{
return new DomainEvent<ExportFinished>();
}
}
// ...
}
public abstract class DomainEventBaseRegistry
{
private static readonly object SynchRoot = new object();
private static readonly HybridDictionary Registries = new HybridDictionary();
private readonly Type _currRegistryType;
private static bool _isRegistering;
protected DomainEventBaseRegistry()
{
_currRegistryType = GetType();
}
public void RegisterEvents()
{
if (_isRegistering || IsRegistered())
return;
lock (SynchRoot)
{
if (IsRegistered())
return;
RuntimeHelpers.PrepareConstrainedRegions();
try
{
_isRegistering = true;
Register();
Registries.Add(_currRegistryType, this);
}
finally
{
_isRegistering = false;
}
}
}
private bool IsRegistered()
{
return Registries.Contains(_currRegistryType);
}
protected abstract void Register();
}
// Register all domain events and corresponding actions
public class DomainEventRegistry : DomainEventBaseRegistry
{
protected override void Register()
{
DomainEvents.ExportFinished.Register(new ExportFinishedAction().NotifyMongo);
// ...
}
}
Обработчик события в настоящее время выглядит следующим образом: // обработчик события / открытый класс действия ExportFinishedAction {public void NotifyMongo (ExportFinished @event) {//}}
В настоящее время события домена регистрируются в Startup.cs следующим образом:
public void Configure(IApplicationBuilder appBuilder, IHostingEnvironment env, ILoggerFactory loggerFactory,
IServiceDiscovery discovery)
{
(new DomainEventRegistry()).RegisterEvents();
}
Событие домена может быть вызвано следующим образом в любом месте кода:
DomainEvents.ExportFinished.Raise(new ExportFinished(finished));
Однако это создает проблему внутри обработчика событий / действия в случае, если мне нужно получить некоторую зависимость, которая будет решена путем внедрения зависимости.Может ли кто-нибудь помочь мне с инфраструктурой, как мне нужно зарегистрировать обработчики событий при запуске службы и избежать этого статически настроенного реестра?