Limit your abstractions: Application Events–what about change?
In my previous post, I showed an example of application events and asked what is wrong with them.
public class CargoInspectionServiceImpl : ICargoInspectionService
{
// code redacted for simplicity
public override void InspectCargo(TrackingId trackingId)
{
Validate.NotNull(trackingId, "Tracking ID is required");
Cargo cargo = cargoRepository.Find(trackingId);
if (cargo == null)
{
logger.Warn("Can't inspect non-existing cargo " + trackingId);
return;
}
HandlingHistory handlingHistory = handlingEventRepository.LookupHandlingHistoryOfCargo(trackingId);
cargo.DeriveDeliveryProgress(handlingHistory);
if (cargo.Delivery.Misdirected)
{
applicationEvents.CargoWasMisdirected(cargo);
}
if (cargo.Delivery.UnloadedAtDestination)
{
applicationEvents.CargoHasArrived(cargo);
}
cargoRepository.Store(cargo);
}
}
This is very problematic code, from my point of view, for several reasons. Look at how it allocate responsibilities. IApplicationEvents is supposed to execute the actual event, but deciding when to execute the event is left for the caller. I said several reasons, but this is the main one, all other flows from it.
What happen when the rules for invoking an event change? What happen when we want to add a new event?
The way this is handled is broken. It violates the Open Closed Principle, it violates the Single Responsibility Principle and it frankly annoys me.
Can you think about ways to improve this?
I’ll discuss some in my next post.
(Note: Opinions expressed in this article and its replies are the opinions of their respective authors and not those of DZone, Inc.)




