Возвращение строго типизированных результатов хранимой процедуры - PullRequest
1 голос
/ 27 октября 2010

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

Однако я не думаю, что мы должны возвращать DataTable из BLL, я всегда думал, что было бы лучше возвращать строго типизированную коллекцию на основе полей в хранимой процедуре, например

public Class MyCustomType
    public customerId as int32
    public name as string
end Class

public function GetCustomers() as Generic.ICollection(Of MyCustomType)
    //call to DAL here
end function

Будет ли лучший способ добиться этого - перебирать нашу DataTable, и для каждого DataRow создать новый объект MyCustomType и добавить его в коллекцию, а затем вернуть коллекцию?

Спасибо.

Ответы [ 3 ]

2 голосов
/ 27 октября 2010

Кажется, ваш дизайн пытается разделить обязанности, но останавливается на полпути.Возврат чего-то такого туманного, как DataTable, на уровень представления данных неявно связывает его с конкретными знаниями схемы источника данных.Скорее всего, DataTable содержит информацию, которая даже не нужна представлению.Обработка специфики вашего BLL и возврат целевого объекта со строгим типом в ваш PL более соответствует модели, к которой, как вам кажется, вы пытаетесь спроектировать.

2 голосов
/ 27 октября 2010

Вот как мы это делаем, где я работаю.В нашем случае мы получаем DataReader и вручную заполняем поля экземпляра класса.Мы также получаем новый тип списка из List<MyClass>, чтобы идти с ним.Убедитесь, что вы делаете правильную проверку для DBNull.Value и правильное преобразование и все такое.

0 голосов
/ 27 октября 2010

Вот ссылка на утилиту, которая может помочь сопоставить DataTable с объектом MyCustomType:

http://www.eggheadcafe.com/articles/20040221.asp

Это немного устарело, но может быть полезно. Возможно, есть и другие инструменты, такие как AutoMapper.

...