I'm trying to write a small app with very strict boundaries between BLL and DAL and am now wondering what the best way would be to pass the data (Domain Transfer Objects) between the layers.
I implemented some classes in a Domain Level (class library) that is accessed by both BLL and DAL. These classes basically just contain properties/data members and currently reflect the DAL data. Ex:
class CustomerData
{
// some data fields
}
Then I implemented some classes in BLL as :
class Customer : CustomerData
{
// Some methods
}
In my DAL I get the customer records from the database through Linq-to-Sql. I then map the linq object to my Domain object by:
CustomerData.field = LinqObject.field
// Etc
My thinking is thus that I now a CustomerData instance from my DAL to BLL when requested (and that I should pass a Customer instance to my UI).
In my BLL I will thus receive a CustomerData instance, but now I want to make a Customer out of it.
Questions:
Thanks !
generally I consider DTO's to be non layer specific, created/consumed by DAL, processed by BLL and consumed/created by UI.
usually each layer is a separate project in the VS solution folder, the DTO's therefore are another project which is referenced by each layer.
this way if there is a field that needs to exist in the UI but not in the other layers, the DTO can be inherited from.
Some notes from my point of view comes here, I'm not an oracle but hopefully it will give some help :)
To me it feels that you have too many "models" here. It might cause confusion and lead to a lot of code just to copy data between different representations. And lot of code means more bugs. Then, I think that the inheritance between your Data-classes and business-classes kinds of limit you when defining your business classes. How about if you want to create a business class that is composed by several data-classes? You should rather use interfaces or composition I think.
Usually, I work with only one conceptual model reflecting the business domain. This model is used both by the data and the business layer and in some cases even the presentation layer (in smaller apps), as Dead Rabit points out. For persistance I use an O/RM such as EF 4.
For larger projects, especially in distributed scenarios I use custom DTO's for the UI-layer(s). These classes reflects the needs of the UI, and could differ a lot from the entities in the conceptual model.
Personally, I think Entity Framework 4 helps you a lot when building apps according to this structure, if you are at an early stage of your project and uses .NET 4 you might want to check it out?
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With