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

前端之家收集整理的这篇文章主要介绍了c# – 没有服务定位器的域事件前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
提供域事件的默认实现:

表示域事件的接口:

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 原文链接:https://www.f2er.com/csharp/243300.html

猜你在找的C#相关文章