/ / Myšlienky na tento prístup pre: EF5 Code First, Repository Pattern, UofW, etc etc - .net, entity-framework-5

Myšlienky na tento prístup pre: EF5 kód prvý, repository vzor, ​​UofW, etc etc -. NET, entity-framework-5

Brázdil som neskutočným množstvom blogov / dokumentácie / atď. O EF Code First, úložiskách, jednotke práce a podobne.

Snažím sa vytvoriť pohodlný rámec pre môj ďalší projekt, ktorý bude obsahovať:

  1. Webové prostredie (HttpContext) aj samostatné (napríklad pre službu Windows)
  2. Dáva mi možnosť definovať úložiská pre konkrétne entity alebo použiť všeobecné repo pre jednoduché dotazy.

Rozhodol som sa, že nebudem zapuzdrovať EF do svojich repozitárov. Nevidím, kedy budeme niekedy uvažovať o prechode na inú ORM.

Takže som vymyslel nasledujúce a budem rád, keď sa dozviem názory! :)

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
}

Vo vyššie uvedenom všeobecnom repo sa nemusím báťo absolvovaní DbContext (ako v odkaze, ktorý spomínam), pretože DbContextInstance sa toho obáva. Je to jediný bod, kde môžem nakonfigurovať pripojovací reťazec atď. Túto časť som udržal jednoduchú, ale môžeme ju vylepšiť tak, aby odniekiaľ čítala názov pripojovacieho reťazca.

Generické repo je IDisposable - v Disposemetóda disponujem kontextom. Vyššie uvedený kód zaisťuje, že v relácii nie je viac ako jeden kontext (buď požiadavka HTTP, alebo životnosť aplikácie EXE). Samozrejme, pokiaľ nie je odstránený.

Jednotky pracovných tried jednoducho vytvoria inštancie repo operácií a budú s nimi interagovať. Budú tiež IDisposable a budú likvidovať úložiská.

Urobím testovanie a makety proti DB.Budem mať skript na resetovanie DB a predbežné vyplnenie počiatočných údajov. Považujem za najlepšie testovať proti skutočnej veci a nie proti niektorým maketám, ktoré veci napodobňujú.

Tento kód je kúsky z rôznych miest + niektoré z mojich vlastných tvorivých schopností.

Vidíte niečo, čo môže neskôr spôsobiť agóniu, keď už je aplikácia spustená? Hoď mi to do tváre! ;)

Vďaka! :)

odpovede:

3 pre odpoveď č. 1

Kontext by mal mať krátke trvanie - zdá sa, že váš kód naznačuje, že váš kontext bude mať dlhú životnosť a bude zdieľaný. To spôsobí váš smútok.