Вы правы, репозиторий не должен возвращать модель представления. Изменения в вашем представлении приведут к изменению слоя данных.
Ваш репозиторий должен быть совокупным корнем . Если ваши property1, property2, Foo, Bar связаны каким-либо образом, я бы извлек новый класс для обработки этого.
public class FooBarDetails
{
public string Property1 {get;set;}
public string Property2 {get;set;}
public Foo Foo {get;set;}
public Bar Bar {get;set;}
}
var details = _repo.GetDetails(detailId);
Если Foo и Bar вообще не связаны, возможно, будет предложено ввести службу для создания ваших FooBarDetails.
FooBarDetails details = _service.GetFooBar(id);
где GetFooBar(int)
будет выглядеть примерно так:
_fooRepo.Get(id);
_barRepo.Get(id);
return new FooBarDetails{Foo = foo, Bar = bar, Property1 = "something", Property2 = "something else"};
Это все предположение, поскольку дизайн репозитория действительно зависит от вашего домена. Использование общих терминов затрудняет развитие потенциальных отношений между вашими объектами.
Обновлено
Из комментария, если мы имеем дело с совокупным корнем ордера. Заказ будет иметь OrderItem, а также клиента, который разместил заказ.
public class Order
{
public List<OrderItem> Items{get; private set;}
public Customer OrderedBy {get; private set;}
//Other stuff
}
public class Customer
{
public List<Orders> Orders{get;set;}
}
Ваш репо должен вернуть полностью гидратированный объект заказа.
var order = _rep.Get(orderId);
Поскольку в вашем заказе есть вся необходимая информация, я бы передал заказ непосредственно модели представления.
public class OrderDetailsViewModel
{
public Order Order {get;set;}
public OrderDetailsViewModel(Order order)
{
Order = order;
}
}
Теперь наличие модели просмотра только с одним элементом может показаться излишним (и, скорее всего, это будет на первых порах). Если вам нужно отобразить больше элементов в поле зрения, это поможет.
public class OrderDetailsViewModel
{
public Order Order {get;set;}
public List<Order> SimilarOrders {get;set;}
public OrderDetailsViewModel(Order order, List<Order> similarOrders)
{
Order = order;
SimilarOrders = similarOrders;
}
}