Как зарегистрировать обработчики событий домена в микросервисе ядра .net - PullRequest
0 голосов
/ 16 октября 2018

Я имею микросервис ядра .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));

Однако это создает проблему внутри обработчика событий / действия в случае, если мне нужно получить некоторую зависимость, которая будет решена путем внедрения зависимости.Может ли кто-нибудь помочь мне с инфраструктурой, как мне нужно зарегистрировать обработчики событий при запуске службы и избежать этого статически настроенного реестра?

...