Использование Microsoft.Practices.EnterpriseLibrary.Data IResultSetMapper <T> - PullRequest
2 голосов
/ 03 октября 2011

Вместо того, чтобы катать свои собственные вспомогательные классы ADO.Net, я решил дать толчок Microsoft.Practices.EnterpriseLibrary.Просматривая документацию и примеры проектов, мне действительно нравится то, что я вижу.

Для моего проекта я буду вызывать хранимые процедуры для всего моего доступа к данным.В частности, я буду сильно полагаться на метод ExecuteSprocAccessor .

Мой вопрос касается использования IResultSetMapper интерфейс.В документах говорится, что классы, которые реализуют этот интерфейс, должны реализовывать метод MapSet (reader: IDataReader): IEnumerable К сожалению, я не могу найти никаких примеров того, как реализовать этот метод.

Ниже приводится правильный способ использования этого:

class MyPOCO : IResultSetMapper<MyPOCO>
{
    int    ID   { get; set; }
    string Name { get; set;}

    public IEnumerable<MyPOCO> MapSet(IDataReader reader)
    {
        // HELP ME HERE! PLEASE!
    }
}

Скажите, пожалуйста, как заполнить этот пробел!И если я собираюсь сделать это правильно (если мои POCO реализуют IResultSetMapper ) или если я просто ухожу!

Спасибо!

Ответы [ 2 ]

2 голосов
/ 04 октября 2011

Вам действительно нужно использовать IResultSetMapper<T>? Ваш POCO достаточно прост для построения с использованием IRowMapper<T>? Если у вас есть простые объекты без иерархий или вложенных коллекций и т. Д., Тогда IRowMapper<T> может быть достаточно хорошим Хотя IResultSetMapper<T> дает вам большую гибкость.

Я бы не стал использовать POCO IResultSetMapper<T>. Я бы создал отдельный класс Mapper. Это устраняет зависимость от Enterprise Library для вашего класса POCO. Кроме того, класс POCO теперь не зависит от отображения. Вы можете изменить отображение или отображение, не влияя на POCO.

public class MyPocoMapper : IResultSetMapper<MyPoco>
{
    public IEnumerable<MyPoco> MapSet ( IDataReader reader )
    {
        using(reader) // Dispose the reader when we're done
        {
            while (reader.Read())
            {
                yield return new MyPoco()
                {
                    MyProperty1 = reader.GetString(
                        reader.GetOrdinal("MyPropertyX")),
                    MyProperty2 = reader.GetString(1)
                };
            }
        }
    }
}
1 голос
/ 03 октября 2011

может быть, вот так

 public IEnumerable<MyPOCO> MapSet(IDataReader reader)
 {
     while(reader.Read())
     yield return new MyPOCO()
                { 
                     ID = reader.GetInt(0),
                     Name = reader.GetString(1) 
                };
 }

если ваш запрос выглядит как "выберите идентификатор, имя из ..."

...