我正在开发电动汽车充电站管理系统,连接了几个Charging Station
s,我陷入了僵局。在这个领域中,我提出了 的聚合Charging Station
,其中包括的内部状态Charging Station
(是否已连接,其连接器的内部状态)。
它有一种UnlockConnector
方法,为了准确尊重其名称(而不是贫血),它将请求发送到相应的Charging Station
,因为它是我的域的中心,以了解 的Charging Station
连接性并将请求发送到物理Charging Station
:
type Connector struct {
Status string
}
type ChargingStation struct {
Connected bool
Connectors []Connector
URL string
...
}
func (station *ChargingStation) UnlockConnector(connectorID int, stationClient service.StationClient) error {
if !station.Connected {
return errors.New("charging station is not connected")
}
connector := station.Connectors[connectorID]
if connector.Status != "Available" {
return errors.New("connector is not available to be unlocked")
}
err := stationClient.SendUnlockConnectorRequest(station.URL, connectorID)
if err != nil {
return errors.New("charging station rejected the request")
}
station.On(event.StationConnectorUnlocked{
ConnectorID: connectorID,
Timestamp: time.Now(),
})
return nil
}
而且我想出了另一个聚合,它代表Charging Session
用户和用户之间的Charging Station
交互Connector
。a 的创建Charging Session
完全与Connector
' 状态相结合,即如果Connector
已经被用户解锁,则创建会话,如果Connector
' 的能量流已停止,则已Charging Session
结束。
不管它们如何耦合,Charging Session
实体似乎不属于Charging Station
聚合,因为它没有回答主要问题:当一个 Station 被删除时,它Charging Session
的 s 是否也应该被删除?)还有,我什么时候会支付此会话中消耗的能量,它与 Station Aggregate Context 没有任何关系。
我想创建一个SessionCreator
域服务,以确保当 aCharging Station
被Connector
解锁时, aCharging Session
也将被创建:
type SessionCreator interface {
CreateSession(station *station.Station, connectorID int, sessionID int) error
}
type sessionCreator struct {
stationClient StationClient
}
type (svc sessionCreator) CreateSession(station *station.Station, connectorID int, userID string, sessionID int) error {
err := station.UnlockConnector(connectorID, svc.stationClient)
if err != nil {
return err
}
session.Create(sessionID, station.ID, connectorID, userID)
return nil
}
但是它只是感觉有点奇怪,并且不能完全满足其他不变量(当连接器的能量流停止时,它必须结束会话),我虽然也制作了一个监听事件的事件监听器StationConnectorUnlocked
,但我只是不知道哪个是理想的方式。