Here’s a repository from an application I’ve been working on recently. It has a pretty significant leaky abstraction problem that I shall be fixing tomorrow:
public interface IEmployeeRepository { void Add(Employee employee); void Remove(Employee employee); void GetById(int id); void Save(Employee employee); }
What’s Wrong with this Picture?
Let me quote the DDD step by step wiki on what exactly a repository is:
Repositories behave like a collection of an Aggregate Root, and act as a facade between your Domain and your Persistence mechanism.
The Add and Remove methods are cool — they provide the collection semantics. GetById is cool too — it enables the lookup of an entity by a special handle that external parties can use to refer to it.
Save on the other hand signals that an object’s state has changed (dirty), and these changes need to be persisted.
What? Dirty tracking? That’s a persistence concern, nothing to do with the domain. Dirty tracking is the exclusive responsibility of a Unit of Work — an application-level concept that most good ORMs provide for free. Don’t let it leak into your domain model! Stay tune for more info on this topic here!