Я думаю, ваш дизайн перевернут. Я предполагаю, что WorkerID может быть связан только с одной Компанией, а HourTrackingID может быть связан только с одним Работником. Обычно ваш Агрегат Root является частью «один» отношения «один ко многим», что означает, что Worker - это AR, а TimeTracking - это агрегат.
Ваша команда будет ClockInWorker и передаст WorkerID. CompanyID не нужен, потому что эта команда не заботится о том, на кого работает работник, просто о том, что они синхронизированы. Эта команда вызовет метод Worker.DoEntry, который создаст запись TimeTracking со временем входа. Затем у вас есть другая команда ClockOutWorker, которая работает таким же образом, но вызывает Worker.DoExit.
Проверка данных (проверка, является ли workerID действительным), происходит как в API, так и в команде. Предполагая, что WorkerID является guid, API проверяет, что он получил фактический guid. API не проверяет, соответствует ли guid реальному работнику - это зависит от команды. API гарантирует, что запрос синтаксически действителен, а команда обеспечивает соблюдение бизнес-правил.
Вы не показываете, принадлежат ли праздничные дни компании или нет. Если это так, то Компания должна проверить Holiday с помощью метода Company.CanWorkerLogTime (workerID, logDate) all. Это следует вызывать из команды перед вызовом Worker.DoEntry. Вы можете получить CompanyID от Работника. Если праздничные дни не принадлежат Компании, то вы бы сделали HolidayService с помощью метода CanWorkerLogTime (logDate)