Sdílet prostřednictvím


N-vrstvé nastavení LINQ to SQL s webovými službami

LINQ to SQL je navržený speciálně pro použití na střední vrstvě ve volně svázané vrstvě přístupu k datům (DAL), jako je webová služba. Pokud je prezentační vrstva webovou stránkou ASP.NET, můžete LinqDataSource pomocí ovládacího prvku webového serveru spravovat přenos dat mezi uživatelským rozhraním a LINQ to SQL na střední vrstvě. Pokud prezentační vrstva není ASP.NET stránku, musí střední i prezentační vrstva provádět další práci pro správu serializace a deserializace dat.

Nastavení LINQ to SQL na střední vrstvě

Ve webové službě nebo n-vrstvé aplikaci střední vrstva obsahuje kontext dat a třídy entit. Tyto třídy můžete vytvořit ručně nebo pomocí SQLMetal.exe nebo Návrhář relací objektů, jak je popsáno jinde v dokumentaci. V době návrhu máte možnost nastavit třídy entit serializovatelné. Další informace naleznete v tématu Postupy: Nastavení entit serializovatelné. Další možností je vytvořit samostatnou sadu tříd, které zapouzdřují data, která mají být serializována, a pak projektovat do těchto serializovatelných typů při vrácení dat v dotazech LINQ.

Pak definujete rozhraní s metodami, které klienti budou volat k načtení, vložení a aktualizaci dat. Metody rozhraní zabalí dotazy LINQ. K zpracování volání vzdálené metody a serializace dat můžete použít jakýkoli druh serializace mechanismu serializace. Jediným požadavkem je, že pokud máte v objektovém modelu cyklickou nebo obousměrnou relaci, například mezi zákazníky a objednávkami ve standardním objektovém modelu Northwind, musíte použít serializátor, který ho podporuje. Windows Communication Foundation (WCF) DataContractSerializer podporuje obousměrné relace, ale XmlSerializer, který se používá s webovými službami bez WCF, ne. Pokud se rozhodnete použít XmlSerializer, je nutné zajistit, aby objektový model neměl žádné cyklické relace.

Další informace o technologii Windows Communication Foundation naleznete v tématu Windows Communication Foundation Services a Datové služby WCF v sadě Visual Studio.

Implementujte obchodní pravidla nebo jinou logiku specifickou pro doménu pomocí částečných tříd a metod v DataContext třídách entit a připojte se k událostem modulu runtime LINQ to SQL. Další informace naleznete v tématu Implementace N-vrstvé obchodní logiky.

Definování serializovatelných typů

Klient nebo prezentační vrstva musí mít definice typu pro třídy, které bude přijímat ze střední vrstvy. Tyto typy mohou být samotné třídy entit nebo speciální třídy, které zabalí pouze určitá pole z tříd entit pro vzdálené komunikace. V každém případě je LINQ to SQL zcela bez obav o tom, jak prezentační vrstva získává tyto definice typů. Prezentační vrstva může například použít WCF k automatickému vygenerování typů nebo může mít kopii knihovny DLL, ve které jsou tyto typy definovány, nebo může jednoduše definovat vlastní verze typů.

Načítání a vkládání dat

Střední vrstva definuje rozhraní, které určuje, jak prezentační vrstva přistupuje k datům. Například GetProductByID(int productID), nebo GetCustomers(). Na střední úrovni tělo metody obvykle vytvoří novou instanci DataContext, spustí dotaz na jednu nebo více jeho tabulky. Střední vrstva pak vrátí výsledek jako IEnumerable<T>, kde T je buď třída entity, nebo jiný typ, který se používá pro serializaci. Prezentační vrstva nikdy neodesílá ani nepřijímá proměnné dotazu přímo do střední vrstvy nebo z ní. Dvě úrovně vyměňují hodnoty, objekty a kolekce konkrétních dat. Po přijetí kolekce může prezentační vrstva v případě potřeby pomocí LINQ to Objects dotazovat.

Při vkládání dat může prezentační vrstva vytvořit nový objekt a odeslat ho do střední vrstvy nebo může mít střední vrstvu konstruktor objektu na základě hodnot, které poskytuje. Obecně platí, že načítání a vkládání dat v n-vrstvých aplikacích se od procesu v 2vrstvých aplikacích moc neliší. Další informace naleznete v tématu Dotazování databáze a provádění a odesílání změn dat.

Sledování změn pro Aktualizace a odstranění

LINQ to SQL podporuje optimistickou souběžnost na základě časových razítek (také pojmenovaných RowVersions) a původních hodnot. Pokud databázové tabulky obsahují časová razítka, aktualizace a odstranění vyžadují trochu další práce na střední nebo prezentační vrstvě. Pokud ale musíte použít původní hodnoty pro optimistické kontroly souběžnosti, je prezentační vrstva zodpovědná za sledování těchto hodnot a jejich odeslání zpět při provádění aktualizací. Důvodem je to, že změny provedené entitami na prezentační vrstvě nejsou sledovány na střední vrstvě. Ve skutečnosti původní načtení entity a případná aktualizace, které v ní byly provedeny, jsou obvykle prováděny dvěma zcela samostatnými instancemi DataContext.

Čím větší je počet změn, které prezentační vrstva dělá, tím složitější je sledovat tyto změny a zabalit je zpátky do střední vrstvy. Implementace mechanismu pro komunikaci změn je zcela v aplikaci. Jediným požadavkem je, aby linQ to SQL mělo být přiděleno těm původním hodnotám, které jsou vyžadovány pro optimistické kontroly souběžnosti.

Další informace naleznete v tématu Načítání dat a operace CUD v N-vrstvých aplikacích (LINQ to SQL).

Viz také