gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 21:12:37 24 4
gpt4 key购买 nike

提供领域事件的默认实现:

表示域事件的接口(interface):

public interface IDomainEvent { }

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

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);
}
}

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

最佳答案

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

我认为像这样的单例成为主流的原因是它是一些著名开发人员提出的首批实现之一,起初并没有太大的错误。另一个原因是可能需要从域内引发事件:

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/

这是我第三次将该链接添加到我的答案中,因为我不得不承认它改变了我的想法。但是,我想我现在会停止这样做。对不起简 :)

所以关键是我们可以将我们的实现更改为以下内容:

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

return new CustomerEnabledEvent(_id);
}
}

现在我们的服务可以更改为使用注入(inject)的调度程序:

public class CustomerService
{
private IDomainEventDispatch _dispatcher;
private ICustomerRepository _customerRepository;

public CustomerService(ICustomerRepository customerRepository, IDomainEventDispatch dispatcher)
{
_customerRepository = customerRepository;
_dispatcher = dispatcher;
}

public void Enable(Guid customerId)
{
_dispatcher.Raise(_customerRepository.Get(customerId).Enable());
}
}

因此不需要单例,您可以愉快地注入(inject)依赖项。

关于c# - 没有服务定位器的领域事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28969371/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com