I'll take a turn at answering.
I think you may have some misconceptions (or more likely I am
misreading) about what should happen. Using your Order/OrderLines
example and starting from the Core, here is how I would do it.
There should be an OrderLine object and an Order object which has a
list of OrderLine objects inside it. This makes the Order the root
aggregate. In the OrdersController, you would have the
IRepository<Order> member which would give the Controller access to
pull and save Order objects from the database (via Get, GetAll, Find,
FindOne, SaveorUpdate, etc) The View could use the Order aggregate as
is in a strongly type view to display the Order and cycle through the
OrderLine list to display the individual OrderLine objects. Typically
the "Business Logic" is inside the Order object to check various
conditions before getting saved back to the database.
This is the standard pattern and I'm sure you're familiar with it; yet
it doesn't work well when the pattern hits the complexity of reality.
I have found that I need to use an ApplicationService which contains
multiple repositories because the view demands that not only can a
Order root aggregate be used, but also a list of Customers, and a list
of ServiceLocations, and a list of.... whatever. I used the
ApplicationService to make it so the controller only needs one member
to use and get all the different things out of the database. This
also allows for me to put business logic for things that have
interdependencies (Orders/Customters/etc.) into one location.
I have also found that the root aggregate objects don't always work
well as the model for a strongly typed view. This isn't new, and is
actually in the Northwind example (search for ViewModel). These
ViewModels are DTOs which are used in the conversation between the
controllers and views. Being a DTO, they are not actually real core
objects and don't have a mapping to the database, but are custom
(usually thinner) objects that are made up of a collection of
Properties. These DTOs don't have business logic, don't have
validation, and usually exist as classes inside the controller class.
When a controller method is called, the controller calls the
Repository or ApplicationService to get a Core object (an Order, for
example), transform it into a ViewModel, and send that to the strongly
typed view. The View displays that ViewModel, manipulates it, and
sends it back to the controller via ModelBinding. The controller then
transforms it back to the appropriate Core object (or objects) and
calls the Repository or ApplicationService to save the objects back to
the database.
Now, this seems like duplication of objects (Core and ViewModel), and
in _some_ cases it is. However, in many cases, the Core objects work
just as is for the round trip from the Core to Controller to View and
back again. This greatly depends on your design. Given a good
design, the database should easily convert into Core objects which can
be used most of the time as is in the Views. But again, when reality
crashes in, you'll find that ViewModel objects and the transformation
to/from Core objects isn't too bad a deal.
Does this help?
Joe