Programování

Jak implementovat návrhový vzor úložiště v C #

Návrhové vzory se používají jako řešení opakujících se problémů ve vašich aplikacích a vzor Repository je jedním z nejpoužívanějších návrhových vzorů. Bude přetrvávat vaše objekty, bez nutnosti vědět, jak by tyto objekty skutečně přetrvávaly v podkladové databázi, tj. Aniž by se musely obtěžovat tím, jak se persistence dat odehrává níže. Znalost této perzistence, tj. Logiky perzistence, je zapouzdřena uvnitř úložiště.

V podstatě návrhový vzor úložiště usnadňuje oddělení obchodní logiky a vrstev přístupu k datům ve vaší aplikaci s tím, že první nemusí mít žádné znalosti o tom, jak by ve skutečnosti došlo k vytrvalosti dat.

Při použití návrhového vzoru úložiště můžete skrýt podrobnosti o tom, jak jsou data nakonec uložena nebo načtena do az datového úložiště. Tímto datovým úložištěm může být databáze, soubor XML atd. Tento návrhový vzor můžete použít i ke skrytí přístupu k datům vystaveným webovou službou nebo ORM. Martin Fowler uvádí: „Zprostředkovává mezi doménovými a datovými mapovacími vrstvami pomocí rozhraní podobného kolekci pro přístup k objektům domény.“

Repozitář je definován jako kolekce doménových objektů, které se nacházejí v paměti. MSDN uvádí: "Použijte úložiště k oddělení logiky, která načte data a mapuje je na model entity od obchodní logiky, která na model působí. Obchodní logika by měla být agnostická vůči typu dat, která zahrnuje vrstvu zdroje dat. . Vrstva zdroje dat může být například databáze, seznam SharePoint nebo webová služba. "

Implementace návrhového vzoru úložiště v C #

V této části prozkoumáme, jak můžeme naprogramovat návrhový vzor úložiště. V naší implementaci návrhového vzoru úložiště zahrnují zúčastněné typy následující:

  1. Rozhraní IRepository - toto rozhraní je základním typem pro všechny typy úložiště
  2. Třída úložiště - toto je obecná třída úložiště
  3. Jedna nebo více tříd úložiště, které implementují rozhraní IRepository

Pojďme nyní kopat do nějakého kódu. Následující třída ukazuje, jak můžete definovat základní třídy entit, ze kterých by měly být odvozeny všechny vaše třídy entit.

veřejná abstraktní třída EntityBase

   {

public Int64 Id {get; chráněná sada; }

   }

Třída je definována jako abstraktní pouze s jedním polem s názvem „Id“. Pole „ID“ je společné pro všechny entity, které obvykle používáte, že? Tady je ukázka, jak by vypadalo obecné rozhraní IRepository.

veřejné rozhraní IRepository kde T: EntityBase

   {

T GetById (Int64 id);

void Create (entita T);

void Delete (entita T);

void Update (entita T);

   }

Obecná třída Repository implementuje IRepository rozhraní a implementuje členy rozhraní.

veřejná třída Repository: IRepository kde T: EntityBase

   {

public void Create (entita T)

       {

// Sem napište svoji logiku, aby entita přetrvávala

       }

public void Delete (entita T)

       {

// Sem napište svoji logiku a smažte entitu

       }

public T GetById (dlouhé ID)

       {

// Sem napište svoji logiku a načtěte entitu podle Id

hodit nový NotImplementedException ();

       }

public void Update (entita T)

       {

// Sem napište svoji logiku a aktualizujte entitu

       }

   }

Vytváření úložišť pro konkrétní třídy

Pokud byste chtěli vytvořit úložiště pro konkrétní entitu, měli byste vytvořit třídu, která implementuje obecné rozhraní IRepository. Následující seznam kódů ukazuje, jak toho lze dosáhnout.

veřejná třída CustomerRepository: IRepository

   {

// Sem napište kód, abyste implementovali každou z metod rozhraní IRepository.

   }

Podobně, pokud byste měli vytvořit ProductRepository, měli byste nejprve vytvořit třídu entity Product, která rozšiřuje třídu EntityBase.

veřejná třída Produkt: EntityBase

   {

veřejný řetězec ProductName {get; soubor; }

public string Kategorie {get; soubor; }

   }

Třída ProductRepository by měla implementovat obecné rozhraní IRepository. Zde by vypadala třída ProductRepository.

veřejná třída ProductRepository: IRepository

   {

// Sem napište svůj kód, abyste implementovali každou z metod rozhraní IRepository.

   }

$config[zx-auto] not found$config[zx-overlay] not found