Вопрос

Недавно я начал новый проект веб-форм и решил отделить бизнес-классы от любых ссылок на DBML.Вместо этого мои классы бизнес-уровня обращаются к дискретным методам уровня данных и возвращают коллекции DTO.Таким образом, уровень данных может проецировать DTO следующим образом:

(from c in dataContext.Customers
where c.Active == true 
select new DTO.Customer
{
   CustomerID = c.CustomerID,
   Name = c.CustomerName,
   ...
}).ToList()

Хотя создание объектов DTO добавляет работы, это кажется лучшим подходом к жесткой привязке между уровнями бизнеса и данных и означает, что я могу протестировать бизнес-уровень без наличия базы данных.

Мой вопрос: является ли это хорошей практикой? Есть ли способ создания DTO (возможно, через SQLMetal) и какие еще проблемы я могу столкнуться по мере продвижения проекта.

Это было полезно?

Решение

Я не знаю, является ли это лучшей практикой, но я написал аналогичный код не так уж и недавно, потому что я тоже чувствовал, что могу улучшить разделение задач, используя свои собственные классы вместо классов, созданных LINQ-дизайнером, в моем приложении. .

Возможно, вы захотите просто вернуть IQueryable<Customer> вместо IList<Customer> из вашего метода доступа к данным.Поскольку IQueryable<T> наследует от IEnumerable<T>, остальная часть вашего приложения должна справиться с этим достаточно хорошо.Вы также можете преобразовать его в список, когда вам действительно нужно.

Преимущество этого заключается в том, что вы можете довольно легко динамически изменять свой запрос и минимизировать объем данных, возвращаемых из SQL Server.

Например.Если ваш метод подпись Iqueryableu003CCustomer> GetCustomers () Вы можете получить одного клиента, позвонив в GetCustomers (). Где (c => c.customerid == 101) .single ();

В этом примере из базы данных будет возвращена только одна запись, тогда как я предполагаю, что в настоящее время ваш код будет возвращать либо всех клиентов, либо вам потребуется написать отдельные методы (и, следовательно, очень повторяющийся код), чтобы удовлетворить все разные вещи, которые вы можете захотеть. фильтровать по.

Другие советы

По моему мнению, в большинстве случаев объекты DTO не нужны при работе с LINQ.Созданные классы LINQ можно легко протестировать.LINQ дает вам возможность запрашивать данные из разных источников, используя одинаковые запросы.Это дает вам возможность тестировать ваши запросы на основе списков объектов вместо реальной базы данных.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top