udi dahan domainevents如何工作?

时间:2015-05-30 05:33:38

标签: c# architecture delegates domain-driven-design

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类型?

1 个答案:

答案 0 :(得分:1)

操作列表是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();