gpt4 book ai didi

c# - 长时间运行的有状态 'services' 适合 DDD 的什么地方?

转载 作者:太空狗 更新时间:2023-10-30 01:36:25 25 4
gpt4 key购买 nike

在更多与行业或自动化相关的应用程序(主要严重依赖于他们必须管理的外部组件)中,您通常会遇到这样一种情况,即领域包含的模型不仅仅是对实际问题的抽象,但也表示和指向物理上存在于域之外的事物。

例如,以表示网络设备的域实体为例:

public class NetworkDevice {
public IPAddress IpAddress { get; set; }
}

应用程序可能需要根据域内的表示来管理外部组件,而不仅仅是存储或验证此类实体或对实体更改采取行动。现在,DDD 是否适合这种情况?那些经理是域服务吗?

埃里克·埃文斯 (Eric Evans) 在他著名的蓝皮书中描述,领域服务需要是一个无状态模型,实现从无处不在的语言中获取的方法来满足实体的请求,或者存储库无法自行处理。但是,如果服务需要有状态怎么办?

一个简单的示例:应用程序需要监控网络已配置 IP 设备,以便将状态事件通知域内的其他应用程序。如果 IP 设备在应用程序中注册(例如,存储在数据库中),“ping 服务”会收到通知并开始监视该设备。

public class PingMonitor : IDisposable,
IHandle<DeviceRegisteredEvent>,
IHandle<DeviceRemovedEvent>
{

public List<NetworkDevice> _devices = new List<NetworkDevice>();

public void Handle(DeviceRegisteredEvent @event) {
_devices.Add(@event.Device);
}

public void Handle(DeviceRemovedEvent @event) {
_devices.Remove(@event.Device);
}

public void PingWorker() {
foreach(var device in _devices) {
var status = Ping(device.IpAddress);
if(status != statusBefore)
DomainEvents.Raise<DeviceStateEvent>(new DeviceStateEvent(device, status));
}
}

}

然后其他组件可以处理这些状态事件,例如如果设备离线,请停止通过其他协议(protocol)与设备通信。

现在,这些组件是什么?起初我认为它们是领域服务,因为它们服务于领域的某种需求。但是,它们是有状态的,并且不具体代表无处不在的语言(ping 服务 的任务是ping 域实体并报告它的状态,但是ping 服务 没有实现客户端允许 ping 设备的方法。

它们是应用程序服务吗?这些组件在 DDD 模式中的什么位置?

最佳答案

在 DDD 中,一个长时间运行的进程称为 Saga。它通常使用领域事件来实现。

以下是对该主题的一些介绍: http://abdullin.com/journal/2010/9/26/theory-of-cqrs-command-handlers-sagas-ars-and-event-subscrip.html/

关于c# - 长时间运行的有状态 'services' 适合 DDD 的什么地方?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22218420/

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