Я немного разбирался в этом и не нашел «идеального» решения. Шаблон репозитория прекрасно работает для приложений MVC, где контекст недолговечен, поскольку существует в недолговечном контроллере, но проблема возникает, когда вы пытаетесь применить эту же структуру к приложению wpf, где виртуальная машина может сохраняться в течение длительных периодов времени.
В прошлом я использовал это решение, которое было намного проще, чем многие из шаблонов репо, которые я видел, пытаясь абстрагировать вещи до предела, что приводит к почти нечитаемому объему кода, который трудно отладить. Вот шаги ...
- Создайте отдельный проект для EDMX, который будет выступать в качестве слоя доступа к данным.
- Создайте папку «Репозитории» под тем же проектом
Создайте базовый класс «BaseRepository», который будет действовать как «Единица работы». IDisposable
позволит вам использовать это в using(){}
и partial
позволит вам реализовать другие репозитории
public partial class MyEntityRepository : IDisposable
{
MyEntities context = new MyEntities();
public void Dispose()
{
context.Dispose();
}
}
Создайте другой файл с именем «MyOtherRepository». создать тот же частичный класс, но реализовать методы, основанные на том, что вы хотите, чтобы этот файл содержал
public partial class MyEntityRepository
{
public void MyOtherMethodSave(EntityObject obj)
{
//work with context
...
context.SaveChanges();
}
}
Теперь в вашей виртуальной машине вы можете сделать это ...
using(MyEntityRepository repo = new MyEntityRepository())
{
repo.MyOtherMethodSave(objectToSave);
}
Это группирует все ваши репозитории под одним классом, поэтому вам не нужно иметь дело с отдельным контекстом. Это позволяет вам лучше управлять различными репозиториями, группируя методы в разные файлы, и помогает предотвратить дублирование кода. Кроме того, ваши контексты так же недолговечны, как и без использования этого шаблона.
Недостатком является то, что в более крупных системах у вас может быть много методов, связанных с вашим репо. Одним из решений в этом случае было бы реализовать некоторые основные общие команды, такие как «Найти» или «Добавить», и внедрить специализированные команды в их соответствующие хранилища.