Рекомендации, где можно установить свойства объекта (шаблон репозитория)


Простой вопрос:

Что бы вы предпочли?

public class FooRepository
{
    public Foo GetById(int id)
    {
        Foo foo = null;
        using (IDataReader data = /* Get Foo's data */)
        {
            // Let the Foo object set it's own fields using the data object
            foo = new Foo(data);
        }
        return foo;
    }
}

Или...

public class FooRepository
{
    public Foo GetById(int id)
    {
        Foo foo = null;
        using (IDataReader data = /* Get Foo's data */)
        {
            // Let the Repository class set the Foo object fields
            foo = new Foo();
            foo.Id = Convert.ToInt32(data["FooID"]);
            foo.Name = data["Name"].ToString();
        }
        return foo;
    }
}

Если вы не можете использовать ORM (NHibernate на, L2S, EF) для обрабатывать это для вас и что вам нужно, чтобы создать foo в других методов репозитория.

Любое объяснение будет приветствоваться!



330
5
c#
задан 29 сентября 2011 в 04:09 Источник Поделиться
Комментарии
3 ответа

Часть цель использовать шаблон репозитория отделить хранилище от домена. Путем передачи объекта IDataReader в объект Foo, я чувствую, что домен получает слишком много знания базового механизма хранения.

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

3
ответ дан 29 сентября 2011 в 06:09 Источник Поделиться

Я бы проголосовал за второй вариант, потому что он позволяет отделить ваши объекты домена из базы данных. Сопоставление лежит слой доступа к данным, а не объектов предметной области. Но как правило, такого рода логика перемещается на специальные занятия, которые называются DataMappers.

2
ответ дан 29 сентября 2011 в 06:09 Источник Поделиться

Учитывая отсутствие ОРМ, я вообще дал вспомогательный метод, как:

IEnumerable<T> ExecuteEnumerable<T>(string commandText, CommandType commandType, IEnumerable<IDbDataParameter> parameters, Func<IDataRecord, T> processRecord)
{
...
using(IDataReader reader ...)
{
while(reader.Read())
{
yield return reader;
}
}
}

Затем я использую его следующим образом:

private static Foo GetFooFromRecord(IDataRecord record)
{
foo = new Foo();
foo.Id = Convert.ToInt32(record["FooID"]);
foo.Name = record["Name"].ToString();
return foo;
}

public Foo GetById(int id)
{
...
// PK - I know there's at most one result
return ExecuteEnumerable(..., GetFooFromRecord).FirstOrDefault();
}

public IList<Foo> GetByName(string name)
{
...
// May be more than one match
return ExecuteEnumerable(..., GetFooFromRecord).ToList();
}

Статический GetFooFromRecord метод в репозитории, его можно повторно использовать для нескольких запросов.

2
ответ дан 30 сентября 2011 в 05:09 Источник Поделиться