/ / Думки щодо цього підходу для: EF5 Code First, Repository Pattern, UofW тощо тощо - .net, entity-framework-5

Думки щодо такого підходу для: Код EF5, схема репозиторію, UofW тощо. - .net, entity-framework-5

Я перебирав неймовірну кількість блогів / документації / тощо про EF Code First, сховища, одиницю роботи тощо.

Я намагаюся створити зручний фреймворк для мого наступного проекту, який обробляє:

  1. Як веб-середовище (HttpContext), так і автономне (для колишньої служби Windows)
  2. Дає мені можливість визначити сховища для конкретних сутностей або використовувати загальне репо для простих запитів.

Я вирішив, що не виграю 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

Контекст повинен бути недовгим - ваш код, здається, означає, що ваш контекст буде тривалим життям і буде спільним. Це викличе у вас горе.