Я перебирав неймовірну кількість блогів / документації / тощо про EF Code First, сховища, одиницю роботи тощо.
Я намагаюся створити зручний фреймворк для мого наступного проекту, який обробляє:
- Як веб-середовище (HttpContext), так і автономне (для колишньої служби Windows)
- Дає мені можливість визначити сховища для конкретних сутностей або використовувати загальне репо для простих запитів.
Я вирішив, що не виграю EF у своїх репозиторіях. Не бачу, коли ми коли-небудь розглянемо можливість переходу на інший ORM.
Тож я придумав наступне і був би радий почути думки! :)
namespace Data.Repositories
{
internal class DbContextInstance
{
public static readonly DbContext Context;
static DbContextInstance()
{
if (System.Web.HttpContext.Current != null)
{
if (System.Web.HttpContext.Current.Items["__DBCONTEXT"] == null)
System.Web.HttpContext.Current.Items["__DBCONTEXT"] = new MyDbContext();
Context = System.Web.HttpContext.Current.Items["__DBCONTEXT"] as MyDbContext;
}
else
{
if (Context == null)
Context = new MyDbContext();
}
}
}
public class GenericRepository<TEntity> : IDisposable where TEntity : class
{
//Implementation of repo. Similar to GenericRepository here: http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/implementing-the-repository-and-unit-of-work-patterns-in-an-asp-net-mvc-application
//whenever I need to access the context I"m using DbContextInstance.Context
}
У вищезазначеному загальному репозиторії мені не потрібно хвилюватисяпро передачу DbContext (як у посиланні, яке я згадую), тому що DbContextInstance турбується про це. Це єдиний момент, де я можу налаштувати рядок підключення тощо. Я робив цю частину простою, але ми можемо вдосконалити її, щоб звідкись зчитувати назву рядка підключення.
Загальне репо може бути одноразовим - в Утилізаціїметод Я розпоряджаюся контекстом. Вищезазначений код гарантує, що в сеансі не більше одного контексту (або HTTP-запит, або термін служби програми EXE). Звичайно, доки він не буде утилізований.
Одиниці робочих класів просто створюватимуть репозиторії та взаємодіятимуть з ними. Вони також можуть бути одноразовими та розпоряджатись репо.
Я буду проводити тестування та макети проти БД. У мене буде сценарій для скидання БД і попереднього заповнення в ньому вихідних даних. Я вважаю, що найкраще перевіряти реальність, а не деякі макети, які наслідують речі.
Цей код - шматочки з різних місць + деякі мої творчі здібності ..
Чи можете ви побачити щось, що може викликати агонію пізніше, коли програма вже запущена? Кинь мені це в обличчя! ;)
Дякую! :)
Відповіді:
3 для відповіді № 1Контекст повинен бути недовгим - ваш код, здається, означає, що ваш контекст буде тривалим життям і буде спільним. Це викличе у вас горе.