Я создаю систему среднего размера и сталкиваюсь с проблемой, с которой, вероятно, некоторые из вас уже сталкивались. На моем бизнес-уровне я возвращаю бизнес-объекты с подмножеством свойств, которые важны для этого бизнес-метода, я беспокоюсь, потому что могу получить много объектов с бессмысленными именами или только один, где только подмножество свойств заполнено заданным метод. Приведу пример.
Случай 1
Например, пользователь принадлежит городу, который, в свою очередь, принадлежит штату и стране, User
, City
, State
и Country
- это таблицы в моей базе данных с большим количеством полей, но мне нужен список пользователей со списком Заказы, поэтому я создаю бизнес-объект, называемый, например, UserWithOthers
, только с важными свойствами (UserId, UserName, CityName, StateName, CountryName, List<Order>
), и мой DAL извлекает только эти поля из базы данных.
Случай 2
Я хочу сейчас вернуть пользователя с количеством заказов, я заканчиваю следующими полями в моем бизнес-объекте (UserId, UserName, CityName, StateName, CountryName, OrdersCount
), и класс может быть вызван, например, UserWithOrderCount
Подумал в некоторых вариантах:
- Сделайте эти два бизнес-класса и заполните их отдельно в каждом методе DAL (эти объекты просты, но учтите, что этот метод может иметь сложный запрос выбора, который необходимо инкапсулировать для повторного использования, поэтому шаблон репозитория здесь не подходит, по крайней мере, я думаю, что ).
- Создайте только один объект
User
со всеми свойствами (UserId, UserName, CityName, StateName, CountryName, OrdersCount, List<Order>
) и заполните только подмножество в каждом методе DAL, но это подразумевает семантическую связь, когда вы используете метод, потому что вы должны знать, какое подмножество полей заполняется из базы данных, а семантическая связь худшее из всех сцеплений. - Вариант 1 не подходит, если мне понадобится другое представление, свойства как
List<Order>
, так иOrdersCount
. - Теперь подумайте, что если вы используете ASP.NET MVC, хорошие практики говорят, что вам нужна ViewModel для перехода к представлению, я думал вернуть ViewModels из моего уровня Businnes, но я не думаю, что это хорошая идея, похоже, что я что-то нарушает, а также невозможно, потому что мой бизнес-уровень находится в другой сборке, а не в веб-приложении.
- Я не хочу писать один и тот же запрос Linq снова и снова, но если использовать NHibernate или EFCodeFirst, это «похоже» на первый вариант, и мне нужно будет создать множество объектов малого бизнеса.
Как вы справляетесь с этой ситуацией? Я считаю, что это дизайнерское решение высокого уровня.