加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 没有服务定位器的域事件

发布时间:2020-12-15 08:21:41 所属栏目:百科 来源:网络整理
导读:提供域事件的默认实现: 表示域事件的接口: public interface IDomainEvent { } 表示通用域事件处理程序的接口: public interface IEventHandlerT where T : IDomainEvent 筹集新活动的中央接入点: public static class DomainEvents{ public static void
提供域事件的默认实现:

表示域事件的接口:

public interface IDomainEvent { }

表示通用域事件处理程序的接口:

public interface IEventHandler<T> where T : IDomainEvent

筹集新活动的中央接入点:

public static class DomainEvents
{
    public static void Raise<T>(T event) where T : IDomainEvent
    {
        //Factory is a IoC container like Ninject. (Service Location/Bad thing)
        var eventHandlers = Factory.GetAll<IEventHandler<T>>();

        foreach (var handler in eventHandlers )
        {
            handler.Handle(event);
        }
    }
}

消费:

public class SaleCanceled : IDomainEvent
{
    private readonly Sale sale;

    public SaleCanceled(Sale sale)
    {
        this.sale = sale;
    }

    public Sale Sale
    {
        get{ return sale; }
    }
}

提升活动的服务:

public class SalesService
{
     public void CancelSale(int saleId)
     {
          // do cancel operation

          // creates an instance of SaleCanceled event

          // raises the event
          DomainEvents.Raise(instanceOfSaleCanceledEvent);
     } 
}

是否有另一种方法可以在不使用服务位置反模式的情况下使用域事件?

解决方法

我想在你的情况下,你真的不需要.使用依赖注入,您可以将IDomainEventDispatcher实现注入到您的服务中.

我之所以认为像这样的单身人士已经成为主流,它是一些着名开发人员首先提出的实现之一,起初并不觉得太错误.另一个原因是可能需要从域内引发事件:

public class Customer
{
    public void Enable()
    {
        _enabled = true;

        DomainEvents.Raise(new CustomerEnabledEvent(_id));
    }
}

在某些阶段,Jan Kronquist发现了这篇文章:http://www.jayway.com/2013/06/20/dont-publish-domain-events-return-them/

这是我第三次将这个链接添加到我的答案中,因为我必须赞扬这一点以改变我的想法.但是,我想我现在就不再这样做了.对不起Jan

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读