域事件在ASP.Net中使用ThreadStatic属性进行回调

时间:2017-09-03 09:34:50

标签: c# asp.net thread-safety domain-driven-design

我正在读一本关于域驱动设计的书。有一章关于域事件。作者指出,如果在ASP.Net应用程序中使用带有[ThreadStatic]属性的回调集合并引用此博客文章,则有理由担心:http://www.hanselman.com/blog/ATaleOfTwoTechniquesTheThreadStaticAttributeAndSystemWebHttpContextCurrentItems.aspx

我在这个博客上阅读了解释。但我不明白究竟是什么问题。 有人使用这种域名事件方法并可以分享他的经验吗?

以下是域事件类的代码(来自Udi Dahan):

 public static class DomainEvents
    {
        [ThreadStatic]
        private static List<Delegate> _actions;
        private static List<Delegate> Actions
        {
            get
            {
                if (_actions == null)
                {
                    _actions = new List<Delegate>();
                }
                return _actions;
            }
        }

        public static IDisposable Register<T>(Action<T> callback)
        {           
            Actions.Add(callback);

            return new DomainEventRegistrationRemover(() => Actions.Remove(callback));
        }

        public static void Raise<T>(T eventArgs)
        {
            foreach (Delegate action in Actions)
            {
                Action<T> typedAction = action as Action<T>;
                if (typedAction != null)
                {
                    typedAction(eventArgs);
                }
            }
        }

        private sealed class DomainEventRegistrationRemover : IDisposable
        {
            private readonly Action _callOnDispose;

            public DomainEventRegistrationRemover(Action toCall)
            {
                _callOnDispose = toCall;
            }

            public void Dispose()
            {
                _callOnDispose();
            }
        }
    }

1 个答案:

答案 0 :(得分:0)

以下是相关问题:

ThreadStaticAttribute in ASP.NET

我已经放弃了这种类型的域事件静态实现,并且更喜欢域从命令方法返回事件。我发现更容易使用和推理。这是另一个相关的问题:

Is it safe to publish Domain Event before persisting the Aggregate?