より多くの産業または自動化関連のアプリケーション (管理しなければならない外部コンポーネントに大きく依存しているアプリケーション) では、実際の問題からの抽象化だけでなく、表現も含むモデルがドメインに含まれている場合がよくあります。ドメインの外に物理的に存在するものへのポインター。
たとえば、ネットワーク デバイスを表す次のドメイン エンティティを考えてみましょう。
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));
}
}
}
次に、他のコンポーネントがこれらのステータス イベントを処理し、たとえば、デバイスがオフラインになると、他のプロトコルを介したデバイスとの通信を停止できます。
さて、それらのコンポーネントは何ですか?最初は、ドメインの特定の要件を満たすため、ドメイン サービスだと思っていました。ただし、これらはステートフルであり、ユビキトス言語を具体的に表していません( ping サービスのタスクは、ドメイン エンティティにpingを実行し、その状態を報告することですが、 ping サービスは、クライアントが ping を許可するメソッドを実装していません)。デバイス)。
それらはアプリケーション サービスですか。そのようなコンポーネントは DDD パターンのどこに収まりますか?