Я не согласен с остальными (отредактируйте: кроме Исаака). Небольшие хранилища - это фасад (а не шаблон).
Если типы сущностей связаны (имеют навигационные свойства друг с другом), то они на самом деле не разделяемы.
Изменение одного типа объекта и фиксация изменений могут зафиксировать изменение для другого.
Кроме того, вы не можете создать небольшой репозиторий над той же единицей работы,
поскольку ORM имеет только ограниченное количество объектов, сопоставленных с базой данных.
Разделите вашу модель на разделяемые домены и создайте одну конкретную единицу работы для каждого домена.
На этих единицах работ создайте агрегированные корни для каждого типа объекта, к которому вам может потребоваться немедленный доступ.
В каждом корне должны быть специально введенные методы add, remove, getbykeys, query и т. Д.
Единица работы должна содержать коммитчаны и аналогичные методы.
Каждый из корней похож на небольшие репозитории, упомянутые другими, однако единицей работы является реальный репозиторий среднего размера (из которых ваша модель может иметь более одного типа).
Пример: * * один тысяча двадцать-одна
// Create one of these
interface IUnitOfWork
{
void Commit();
}
// Create one of these
interface IEntitySet<TEntity> where TEntity : class
{
void Add(TEntity entity);
void Remove(TEntity entity);
TEntity Create<TSpecificEntity>() where TSpecificEntity : TEntity;
IQueryable<TEntity> Query();
}
// Create one of these per entity type
interace IEntitySetOfTEntity1 : IEntitySet<Entity1>
{
TEntity1 GetByKeys(int key1);
}
interace IEntitySetOfTEntity2 : IEntitySet<Entity2>
{
TEntity1 GetByKeys(short key1, short key2);
}
// Create one of these per separatable domain
interface IDomain1UnitOfWork : IUnitOfWork
{
IEntitySetOfTEntity1 Entity1s
{
get;
}
IEntitySetOfTEntity2 Entity2s
{
get;
}
}
Все эти интерфейсы и их реализации могут генерироваться автоматически.
Эти интерфейсы и их реализации очень легкие и ни в коем случае не являются "ОГРОМНЫМ классом с большим количеством методов". Так как они могут генерироваться автоматически, обслуживание просто.
Специальные интерфейсы могут быть добавлены к интерфейсам IDomain1UnitOfWork, IEntitySetOfTEntity1 и т. Д. С помощью:
а. методы расширения
б. частичные интерфейсы и классы (менее рекомендуется, так как это приводит к менее чистому DAL)
Интерфейсы, подобные IEntitySetOfTEntity1, можно игнорировать, если вы используете методы расширения для добавления методов GetByKeys () в IEntitySet .