Zapouzdření   otázka

VB.NET, ADO.NET, Architektura, WinForms

Dobrý den,

řeším jednu specifickou věc týkající se tvorby vlastních ovladacích prvků.

Mám vlastní control, který je odvozený od třídy TextBox. Prvku jsem nadefinoval vlastní metodu a vlastnosti.

Rád bych, aby se prováděla validace hodnoty zadané do textového pole na základě hodnot, uložených v nějaké tabulce na MSSQL. Z toho je jasné, že je zapotřebí tomuto controlu předat i příslušný objekt SqlConnection, aby se uvnitř prvku mohl vykonat dotaz do databáze a na základě výsledku se vyhodnotil výsledek.

Toto je samozřejmě možné provést tak, že prvek bude mít vlastnost, do které se předá objekt SqlConnection.

Rád bych to ale celé udělal ještě trochu sofistikovaněji, jelikož se tento prvek bude v rámci celého projektu opakovaně používat na různých formulářích.

Můj dotaz tedy zní, zda je možné nějakým způsobem automaticky předávat uvedený sql konekt, aniž by bylo nutné jej v kódu každého formuláře, kde je zmiňovaný prvek použit explicitně přiřazovat?

Samozřejmě by to bylo možné přes public proměnnou, ale to mi nepřijde zrovna vhodné ve vztahu k principům OOP (zapuzdření).

Lze toto nějak v praxi řešit? A pokud ano, jak?

Děkuji

nahlásit spamnahlásit spam 0 odpovědětodpovědět

ConnectionString se běžně definuje v Settings aplikace a je potom přístupný pomocí singletonu jako Public vlastnost (lze změnit na Friend) v rámci celého projektu v My.Settings.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Aha,

vidíte, to mne vůbec nenapadlo. Díky moc.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Ještě bych poznamenal, že z hlediska architektury je potřeba zvážit, kde všude bude vlastní ovládací prvek použit. Pokud to bude jenom v jednom projektu, pak není problém řešení které jsem uvedl. Pokud to bude ve více projektech, vyplatilo by se použít dependency injection nebo něco podobného, protože odkazováním se na konkrétní vlastnost My.Settings vytvoříte pevnou vazbu mezi ovládacím prvkem a touto třídou (která nemusí být v jiných projektech).

nahlásit spamnahlásit spam -2 / 2 odpovědětodpovědět

Ano, přesně tak.

Zrovna jsem se chtěl zeptat i na tento případ.

Jedním z požadavků je i to, že vlastní prvky by byly fyzicky v samostatném DLL, které by se do jiných projektů referencovalo.

Můžete mi prosím alespoň v základech nastínit, jaký je princip Vámi zmiňované druhé možnosti? Případně, pokud víte o nějaké dobrém informačním zdroji, kde by se tato problematika dala nastudovat, byl bych Vám velmi vděčen.

Ještě jednou děkuji.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Pokud bude ovládací prvek v samostatné DLL assembly, musí být konfigurační sekce pro toto DLL v konfiguračním souboru EXE assembly, která toto DLL využívá. To je velmi nepohodlné. Pokud používáte systém pro správu zdrojového kódu, můžete sdílet zdrojové kódy ovládacího prvku více projekty najednou a tím se zbavíte samostatné DLL knihovny a problémů s konfiguračním souborem. Konfigurační hodnoty můžete předávat v konstruktoru. Kromě toho se mi nezdá, aby jediný (a určitě ne nijak složitý, pouze upravený TextBox) ovládací prvek byl v samostatné assembly.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Děkuji za odpověď.

Ve zmíněné DLL nebude pouze jedna jediná komponenta.

Ano, máte pravdu, v podstatě se bude jednat o jednouchý textbox, pouze rozšířený o pár vlastností a již zmíněnou validaci.

Mně šlo spíše o princip, jak toto z pohledu principů OOP správně udělat.

Děkuji.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Tak jsem se snažil nějak pobrat způsob práce v IoC respektive Dependency Injection a narovinu přiznávám, že jem to nepochopil. Nevíte o nějakém dobré info zdroji, kde by se tyto věci daly nastudovat? Nejlépe např. formou tutoriálu.

Rád bych tyto principy aplikoval na uvedený control, ale v tuto chvíli z toho opravdu nejsem vůbec chytrý.

Ještě jednou děkuji.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Dependency injection je poměrně jednoduchý návrhový vzor, který řeší problém pevné vazby třídy B na třídu A. Pevná vazba brání jednoduché rozšiřitelnosti a škálovatelnosti. Místo toho, aby se třída B přímo odkazovala na třídu A, třída C vloží odkaz na třídu A do třídy B. Třída C je sice kód navíc, ale má to dost výhod. Pro vaše účely bude nejjednodušší předat parametry v konstruktoru třídy B. Více o Dependency injection na Wikipedii:

http://en.wikipedia.org/wiki/Dependency_...

Ve vašem případě je třída A My.Settings a třída B ovládací prvek.

nahlásit spamnahlásit spam -2 / 2 odpovědětodpovědět

Mnohokrát Vám děkuji pane Linhart.

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback