Я вивчив це зовсім небагато і не знайшов "ідеального" рішення. Шаблон сховища чудово працює для програм MVC, де контекст недовговічний, оскільки він існує в короткочасному контролері, але проблема трапляється, коли ви намагаєтесь застосувати ту саму структуру до програми wpf, де VM може зберігатися протягом тривалого періоду часу.
У минулому я використовував це рішення, яке набагато простіше, ніж багато репо-шаблонів, які я бачив, намагаючись абстрагувати речі до крайньої кількості, в результаті чого майже не читаються кількості коду, які важко налагодити. Ось етапи ...
- Створіть окремий проект, щоб EDMX виступав як ваш рівень доступу до даних
- Створіть папку "Репозиторії" під тим самим проектом
Створіть базовий клас "BaseRepository", щоб діяти як "одиниця роботи". IDisposable
дозволить вам використовувати це в a, 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);
}
Це об'єднує всі ваші сховища в одному класі, тому вам не доведеться мати справу з окремим контекстом. Це дозволяє краще керувати різними репозиціями шляхом групування методів у різні файли та запобігає дублюванню коду. Крім того, ваші контексти такі ж недовговічні, як і раніше, без використання цього шаблону.
Недоліком є те, що у великих системах у вас може бути безліч методів, які підпадають під ваш репо. Одним з рішень у цьому випадку буде реалізація деяких основних загальних команд, таких як "Знайти" або "Додати", та впровадити спеціалізовані у відповідне сховище.