Repository, Pipeline, business logic and domain model - how do I fit these together?

I'm designing N-tier application and I came across a difficulty which you might have a solution to. Presentation layer is MVC.

My ORM is carried out using LinqToSQL - it's a seperate project which serves repositories.

Each reporsitory has an interface and at least 1 concrete implementation.

Repositories have the following methods: FindAll(), Save(T entity), Delete(int id)

FindAll() returns IQueryable of some type, which means that it returns queries to which I can apply filters.

ORM mapping has been carried out using Database First methodology, where tables were created first and then classes were generated by SQL Metal.

I have added a Pipeline layer which works with repositories. It applies further filters to queries. E.g. OrderRepository.FindAll().Where(o => o.CustomerId == 10)

Pipeline also returns IQueryable of some type, which means that I can pass it further up the layer and do more stuff with it.

At this point I would like to move to the BusinessLogic layer, but I don't want to work with entity models any longer, I want to convert entity model to a domain model. This means that I can add validation to a model and use that model in the presentation layer. Model can't be defined in MVC project as it would be dependant on the presentation layer, so that's a no.

I'm fairly certain that business logic (behaviour) and model must be stored seperate from pipeline, data and presentation layer. The question is where?

For example, a pipeline has three methods: 1. FindByCustomerId 2. FindByOrderId 3. FindBySomethingElse

All these methods return IQueryable of Order. I need to convert this to a domain model, but I don't want to do it per each method as it won't be mainteinable.

I feel that this model is fairly robust and scalable. I just don't see what is the best place for mapping from entities to domain model and vise versa.

Thank you

14
задан 1 June 2011 в 13:53
поделиться