在更多与行业或自动化相关的应用程序(主要依赖于他们必须管理的外部组件)中,您通常会遇到这样的情况,即域包含的模型不仅仅是对实际问题的抽象,还有表示of 和指向物理上存在于域之外的东西的指针。
例如,以这个代表网络设备的域实体为例:
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 服务的任务是ping域实体并报告其状态,但是ping 服务没有实现客户端允许 ping 的方法一个装置)。
它们是应用服务吗?这些组件在 DDD 模式中的什么位置?