我正在开发电动汽车充电站管理系统,连接了几个Charging Stations,我陷入了僵局。在这个领域中,我提出了 的聚合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,但我只是不知道哪个是理想的方式。