【发布时间】:2014-03-06 07:58:09
【问题描述】:
在更多与行业或自动化相关的应用程序(主要依赖于他们必须管理的外部组件)中,您通常会遇到这样的情况,即域包含的模型不仅仅是对实际问题的抽象,还包括物理上存在于域之外的事物的表示和指针。
例如,以这个代表网络设备的域实体为例:
public class NetworkDevice {
public IPAddress IpAddress { get; set; }
}
应用程序可能需要根据外部组件在域内的表示来管理外部组件,而不是仅仅存储或验证此类实体或对实体更改采取行动。现在,DDD 甚至适用于这种情况吗?这些经理是域服务吗?
Eric Evans 在他著名的蓝皮书中描述了域服务需要是一个无状态模型,实现从 ubiquitos 语言中获取的方法来满足实体的请求,或者存储库无法自行处理。但是如果服务需要有状态呢?
一个简单的例子:一个应用程序需要监控网络内的配置 IP 设备,以便通知域内的其他应用程序有关状态事件的信息。如果 IP 设备在应用程序中注册(例如存储在数据库中),“ping-service”会收到通知并开始监控设备。
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));
}
}
}
然后其他组件可以处理这些状态事件,例如如果设备离线,请停止通过其他协议与设备通信。
现在,这些组件是什么?起初我认为它们是域服务,因为它们服务于域的某种需求。但是,它们是有状态的,并且不具体代表 ubiquitos 语言(ping-service 的任务是 ping 域实体并报告它的状态,但是 ping-service 没有实现客户端允许 ping 设备的方法)。
它们是应用程序服务吗?这些组件在 DDD 模式中的位置是什么?
【问题讨论】:
-
我不明白为什么 PingMonitor 是有状态的。它处于什么状态?
-
@Hippoom PingMonitor 存储并监视在整个应用程序生命周期内已在应用程序内注册的所有网络设备,因此在单例生命周期范围内运行。
标签: c# design-patterns domain-driven-design cqrs onion-architecture