Hello: I'm trying to get a clear final answer to a question that's driven me nuts for a long time.
It's commonly expressed that BLL should contain Business Logic and Business Objects (BO), and have a reference to the DAL. The DAL on the other hand, cannot have a reference to the BLL, so it cannot accept the BO's as arguments, or return the BO's as return values.
The most traditional answer to this problem is to:
a) Accept simple parameters, and return (preferably Typed) DataSets and DataTables to return data: namespace DAL { public class Contacts public DataTable GetContacts(){...} public UpdateContacts (DataTable contacts) {...}
b) The second most recommended solution is to define temporary, serializable, Data Transfer Objects (DTOs) (sometimes called Value Objects (VO)) which have only fields and properties, no methods, and are only used to briefly transfer the data back up to the BLL layer, where there are used to populate new BO's, at which point they are then discarded.
c) Use a common third assembly (eg called Entities.dll), that define the BO's, and is referenced by all 3 layers: the UI, BLL, and DAL.
Option a) takes the least work to implement (no need to build another assembly), hence why so often proposed, but DataTables have extra wiring that doesn't need to be needed just for the simple operations.
Yet it's very unclear as to which of b) or c) is better...
I see b) offered sometimes, and almost never c), although c) seems to be the easiest of the two.
What am I missing? Why is c) so rarely offered even though it appears to be logically the easiest, and why is a) offered when its clearly not suitable for all scenarios (eg returning single objects)?
Thank you!