udi dahan domainevents类是如何工作的

本文关键字:工作 何工作 dahan domainevents udi | 更新日期: 2023-09-27 17:51:14

Udi Dahan DomainEvent类如下:

namespace Udi.DomainEvent
{
    public static class DomainEvent
    {
        private static List<Delegate> Actions;
        public static IDisposable Register<T>(Action<T> callback)
        {
            Actions.Add(callback);
            return new DomainEventRegistrationRemover(() => Actions.Remove(callback));
        }
        private sealed class DomainEventRegistrationRemover : IDisposable
        {
            private readonly Action _callOnDispose;
            public DomainEventRegistrationRemover(Action callTo)
            {
                _callOnDispose = callTo;
            }
            public void Dispose()
            {
                _callOnDispose();
            }
        }
    }
}

我不明白Actions<T>.Remove()函数调用时如何调用Actions委托?为什么Register<T>()方法返回IDisposable类型?

udi dahan domainevents类是如何工作的

动作列表是这样的,DomainEvent类知道要执行什么作为每个注册的回调。返回IDisposable,以便用户可以通过处理该值来注销回调。

我怀疑这样做的原因是这样你可以注册和注销一个匿名委托,否则你将不得不保持一个对动作的引用,并在你注销时传递它。

用法:

var registration = domainEvent.Register(() => Console.WriteLine("I am registered")); 
// do stuff
// domainEvent may call callback while we are doing work.
// unregister, domainEvent can't call callback anymore.
registration.Dispose();