An application always needs to define objects that can be used through out all the application layers. For example, lets say we are developing a three layers application that includes UI, BLL and DAL, an object/entity sometimes must be recognized both in the DAL and in the UI.
To achieve that we need to define a place that all can reference to and see the entities.
So, when we design the application we need to think about sharing objects between layers.
There are several options on how to do so. I will present two possibilities, however would love to here your thoughts on the matter.
"God DLL"
The way to think about this matter is as a single DLL that all other DLLs are looking at. He knows no one in particular but everyone else knows him. This way there is no circular dependency.
In other wards, there is one DLL that describes the entire common classes / entities and all the layers in the application must add a reference to it.
"DLL Per Module"
When your application is modularly designed, this concept is better. Lets say that your application enable each customer to see different modules according to license, putting all the common objects / entities in a single DLL is not recommended.
In this case it is better to separate the common types into modules that will be deployed / loaded only if needed.