Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Domain Driven Design, SOC, and entity identification

I've been trying to wrap my mind around DDD and how it can relate to MVC, but I'm having trouble with regards to entity identification.

In particular, I'm trying to maintain strict separation between my presentation, domain, and data models. My hangup here is in how I preserve entity identification across these boundaries. To clarify, I'm using separate classes to represent the same entity in different contexts - for example, I have a 'ShipmentRequest' domain class, several 'ShipmentRequestView' presentation classes (depending on the properties required by a particular view), and a 'shipment_request' database table (my data model).

I feel like using an 'ID' property (like ShipmentRequestId) would be a violation of the separation I'm trying to achieve, since this ID property is a database concern, and not a domain concern; and I don't want to pass the same object between layers, as this would mean passing unneeded data into my presentation layer.

How do I preserve this separation, and yet track identity between these layers?

like image 215
Erik Forbes Avatar asked Feb 05 '09 21:02

Erik Forbes


People also ask

What is entity in domain-driven design?

In domain-driven design, an entity is a representation of an object in the domain. It is defined by its identity, rather than its attributes. It encapsulates the state of that object through its attributes, including the aggregation of other entities, and it defines any operations that might be performed on the entity.

What is domain-driven design example?

An aggregate is a domain-driven design pattern. It's a cluster of domain objects (e.g. entity, value object), treated as one single unit. A car is a good example. It consists of wheels, lights and an engine.

Should domain objects have ids?

Ids in domain entities is a design smell. In most cases, they indicate poor entity encapsulation. If you want proper separation of concerns, you should reduce the number of Ids in your domain entities to as low as possible.

What are the benefits of a domain model and the role of domain-driven design DDD model?

DDD has the additional benefit of creating a shared understanding (ubiquitous language) between teams when designing technical solutions. Skilled facilitation of domain modelling sessions helps our clients get to grips with their domain.


1 Answers

Without the Id field in your entity you cannot map it to a database row. Therefore this id field even though it has nothing to do with your entities must leak into your domain model.

I feel it is most often overkill to use a presentation model, especially if what your are trying to achieve is hide some properties.

I think separation of concerns is mostly driven by the bounded context. For example, your Person, PersonView and Person table all seem the relate to a transaction processing context. In such a context I would make not even have a PersonView and the person table would be abstracted away.

On the other hand if you are in a reporting context, a PersonView would be more useful.

I think that the context is much more important than any layering scheme.

As for the lack of a natural key in your person entity, it could mean that Person is not really an entity. For exemple, in any real life application, there is always a number associated with the person: an employee has a employee number, a client as an account number, etc. This business id is definitely part of the domain.

like image 181
Simon Laroche Avatar answered Sep 20 '22 17:09

Simon Laroche