Шаблон репозитория: Как реализовать базовый репозиторий, включая предикат в C # - PullRequest
1 голос
/ 22 октября 2010

Я новичок в репозиториях. Я только что прочитал о реализации предикатов и единицы работы (Фаулера). Я видел интерфейсы репозитория, подобные следующему:

public interface IRepository<ET> {
    ET        Add( ET entity);
    ET        Remove( int id);
    ET        Get( int id);
    IList<ET> Get(Expression<Func<T, bool>> predicate);
}

Конечно, единица работы внедрит контекст данных (вентилятор Microsoft) в новый репозиторий, где у единицы работы будет метод .Save (), вызывающий Сохранить во всех контекстах данных.

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

Это правильно? Протекает? Что мне не хватает? Должны ли методы OrderBy когда-либо находиться в репозитории? Следует ли каким-либо образом реализовать пейджинг (.Skip (). Take ()) в предикате?

Ссылки на примеры кода были бы фантастическими, особенно как реализовать предикат в репозитории.

Ответы [ 2 ]

5 голосов
/ 22 октября 2010

если вы имеете в виду Entity Framework я бы посоветовал вам прочитать это: http://blogs.msdn.com/b/adonet/archive/2009/06/16/using-repository-and-unit-of-work-patterns-with-entity-framework-4-0.aspx

Обновление:

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

1, Упростить реализацию операций CRUD для всех сущностей. с одним интерфейсом:

public interface IDataRepository<T> where T : class

тогда вы сможете очень легко и быстро копировать других

public class EntityOneRepository : IDataRepository<EntityOne>
public class EntityTwoRepository : IDataRepository<EntityTwo>

2, держит мой код сухим. некоторые объекты могут иметь свой собственный метод для манипулирования данными. (т.е. процедура хранения) Вы можете легко расширить его, не касаясь других хранилищ.

public interface IDonationRepository : IDataRepository<Donation>
{
//method one
//method two
//....
}

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

Некоторое время поддержание чистоты и логической читаемости кода также важно для лучшей структуры приложения.

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

Представленный вами интерфейс репозитория представляет собой очень простой в использовании интерфейс CRUD, который может хорошо работать во многих типах приложений. В общем, я бы предпочел не иметь параметров или параметров подкачки и сортировки в моем репозитории, вместо этого я бы предпочел вернуть IQueryable и позволить вызывающим абонентам составлять эти типы операций в запросе (если вы используете IQueryable, такую ​​технологию, как EF) или nHibernate может перевести эти операторы в SQL - если вы прибегаете к IList или IEnumerable, это все в операциях с памятью).

Хотя я избегаю разбиения на страницы и сортировки, у меня могут быть более конкретные операции с хранилищем, чтобы защитить бизнес-логику от некоторых деталей. Например, я мог бы расширить IEmployeeRepository из IRepository и добавить метод GetManagers или что-то подобное, чтобы скрыть выражение Where, необходимое в запросе. Все зависит от приложения и уровня сложности.

Одна важная заметка по этому предложению в вашем посте:

Конечно, единица работы будет внедрить контекст данных (фанат Microsoft) в новый репозиторий, где блок работы будет иметь метод .Save (), вызов Save во всех контекстах данных.

Убедитесь, что вы используете один контекст данных / контекст объекта внутри каждой единицы работы, потому что контекст, по сути, является базовой единицей работы. Если вы используете несколько контекстов в одной и той же логической транзакции, тогда у вас фактически будет несколько единиц работы.

У меня есть несколько примеров реализации в этом проекте: http://odetocode.com/downloads/employeetimecards.zip

Код может иметь больше смысла, если вы прочитаете эту статью: http://msdn.microsoft.com/en-us/library/ff714955.aspx

Надеюсь, это поможет,

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...