/ / Przemyślenia na temat tego podejścia dla: EF5 Code First, Repository Pattern, UofW, etc etc - .net, entity-framework-5

Myśli na temat tego podejścia dla: EF5 Code First, Repository Pattern, UofW, etc etc - .net, entity-framework-5

Brodziłem przez niewiarygodną ilość blogów / dokumentacji / itp. O EF Code First, repozytoriach, jednostce pracy i tak dalej.

Próbuję stworzyć wygodną platformę dla mojego następnego projektu, która będzie obsługiwać:

  1. Zarówno środowisko internetowe (HttpContext), jak i samodzielne (np. Usługa Windows)
  2. Daje mi możliwość definiowania repozytoriów dla określonych encji lub używania repozytorium ogólnego do prostych zapytań.

Zdecydowałem, że nie będę hermetyzować EF w moich repozytoriach. Nie widzę, kiedy kiedykolwiek rozważymy przejście na inny ORM.

Tak więc wymyśliłem następujące i z przyjemnością usłyszę opinie! :)

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
}

W powyższym repozytorium generycznym nie muszę się martwićo przekazywaniu DbContext (jak w odnośniku, o którym wspominam), ponieważ DbContextInstance się tym martwi. To pojedynczy punkt, w którym mogę skonfigurować parametry połączenia itp. Utrzymałem tę część w prostocie, ale możemy ją ulepszyć, aby skądś odczytać nazwę ciągu połączenia.

Generic Repo is IDisposable - in the Disposemetoda Pozbywam się Context. Powyższy kod zapewnia, że ​​w sesji nie ma więcej niż jednego kontekstu (żądanie HTTP lub żywotność aplikacji EXE). Oczywiście, o ile nie zostanie on usunięty.

Jednostki klas roboczych po prostu utworzą instancje repozytoriów i będą z nimi współpracować. Będą również IDisposable i zlikwidują repozytoria.

Zrobię testy i makiety na DB.Będę miał skrypt do resetowania bazy danych i wstępnego wypełnienia go danymi początkowymi. Uważam, że najlepiej jest testować na prawdziwych rzeczach, a nie na makietach, które naśladują rzeczy.

Ten kod to fragmenty z różnych miejsc + trochę mojej własnej kreatywności.

Czy widzisz coś, co może spowodować agonię później, gdy aplikacja jest już uruchomiona i działa? Rzuć mi to w twarz! ;)

Dzięki! :)

Odpowiedzi:

3 dla odpowiedzi № 1

Kontekst powinien być krótkotrwały - Twój kod wydaje się sugerować, że Twój Kontekst będzie miał długą żywotność i będzie udostępniony. Spowoduje to smutek.