TableAdapter (connection string), večnivojska zasnova rešitve

Delam na web aplikaciji, ki je zasnovana tvečnivojsko. Ker se bodo knjižnice uporabljale še v drugih projektih imam DAL nivo razdeljen na več projektov (avtorizacija, revizijska sled,..). Ni mi pa všeč, da se v vsakem projektu nahaja connection string in bi ga hotel v run time-u prepisat iz neke konfiguracijske datoteke..npr. iz web.configa.

Zanima me, kakšen princip vi uporabljate v teh primerih, ker spremijat connection vsakemu projektu posebej zihr ni prava rešitev.

lp, Aleš

Avtor: Aleš Gaber, objavljeno na portalu SloDug.si (Arhiv)

Leave a comment

Please note that we won't show your email to others, or use it for sending unwanted emails. We will only use it to render your Gravatar image and to validate you as a real person.

AndrejT
AndrejT - sreda, 14. februar 2007

[Edit] Znotraj tableadapterja sta _adapter in _commandCollection označena kot private in se ne pustita enostavno izpostavit v public kot npr. Connection. Mogoče bi vseeno lahko poskusil z razširtvijo s partial classom - v razširitvi pripraviš ustrezne public lastnosti, ki vračata _adapter ali _commandCollection, odvisno od potreb.

Aleš Gaber
Aleš Gaber - sreda, 14. februar 2007

Web.config lahko uporabim, saj bi imela vsaka web aplikacija svoj "config" in bi brala nastavitve neodvisno. Da bi v partial class vsakemu tableadapterju posebej nastavljal property-je se mi ne zdi ok...ker bi rad generalno rešil problem. Osnovni class bi potem recimo skrbel za logiranje, revizijsko sled,..saj če ne bo druge bom moral delat v partial classih.Se mogoče da pridobiti commandtext, ki je bil dejansko klican preko metode tableadapterja (vključno z vrednostmi parametrov)? 

AndrejT
AndrejT - torek, 13. februar 2007

Aleš Gaber:Gre sicer za ASP.NET aplikacijo, vendar se bo osnovni DAL uporabljal za več web aplikacij, ki bodo lahko tekle tudi na istem strežniku, connection string pa ne bo isti in bo odvisen od posamezne aplikacije. Torej je nujno, da imam kontrolo nad connection-om oz connection stringom.Od kje pa boš bral "pravi" connection string? Kolikor razumem, ti shranjevanje connection stringa v web.config, od koder ga bo bral table adpter, ne gre na roko?

zigaj
zigaj - torek, 13. februar 2007

Ne bi raje uporabil partial class v ločenem kodnem filetu in se "od strani" priklopil na interne property-je obstoječega tableAdapterja?  Tudi TableAdapter sam je partial class, tako da ga lahko na ta način b.p. razširiš. Bi ti verjetno dokaj olajšalo življenje, nimaš komedij z baseclassi in reflectionom, pa tudi težav s samodejno generirano kodo ni.   

Aleš Gaber
Aleš Gaber - sreda, 07. februar 2007

Jaz sem poskusil tableadapterju dodati metodo in ni spremenil kode oz. nastavitve baseclass-a. Preveril sem tudi v kodi in tableadapter deduje iz tega base classa tudi po tem, ko spremenim oz. dodam metode..na prvi pogled je videti, da VS ne povozi kode..ali pa nisem še poskusil kaj takega ..iz VS designerja po tem ko sem dodal dodatno metodo..public partial class tblTableAdapter : "namespace".BaseDAL..Gre sicer za ASP.NET aplikacijo, vendar se bo osnovni DAL uporabljal za več web aplikacij, ki bodo lahko tekle tudi na istem strežniku, connection string pa ne bo isti in bo odvisen od posamezne aplikacije. Torej je nujno, da imam kontrolo nad connection-om oz connection stringom.

AndrejT
AndrejT - sreda, 07. februar 2007

Ta  varianta zahteva spremembo kode, ki jo generira Visual Studio, kar pomeni, da jo boš moral spreminjat vsakič, ko kaj spremeniš v datasetu in bo Visual Studio povozil tvoje spremembe. Sicer obstajajo variante, kako to preprečit, vendar bi lahko v tem primeru namesto uporabe lastnega baznega razreda v tej kodi ustrezno popravil tudi del, ki vrača connection string.Ker gre za aplikacijo ASP.NET, bi še vedno rekel, da je najboljši način pustiti tableadapter pri miru in zagotoviti, da bo connection string bral iz pravega mesta. Transakcije pa lahko implementiraš kot razširitev table adapterja v novem razredu (partial classes...)

Aleš Gaber
Aleš Gaber - sreda, 07. februar 2007

Mislim, da sem našel eno varianto, ki mi ustreza. Na TableAdapterju je treba nastaviti BaseClass na neki lastni class, ki deduje iz System.ComponentModel.Component  in tam kontroliram povezavo, transakcije,..Da lahko dostopam do TableAdapter property-ja connection pa moram uporabiti Reflection..No, stvar moram še implementirat..Če je kdo že poskušal podobno rešit ta problem, bi bile izkušnje nadvse dobrodošle.

Aleš Gaber
Aleš Gaber - ponedeljek, 05. februar 2007

Se opravičujem..tale copy-paste varianta je vse skupaj potrojila..

Aleš Gaber
Aleš Gaber - ponedeljek, 05. februar 2007

Prva varianta mi je jasna, da vedno prebere iz konfiguracijske datoteke. Moj primer je druga varianta, ko želim programsko spremeniti table adapterju connection string..s tem želim doseči le to, da je je conn.string zapisan le na enem mestu.Načeloma mi je druga varianta jasna, vendar imam težave kako naprej.. Če prav razumem, moram na code behind-u ustvarit nekaj podobneganamespace DAL {partial class DataSet1{partial class TableAdapter1  {   // prijavit se na nek dogodek EndInit()  ??? in zamenjat connstring   }}} DAL {partial class DataSet1{partial class TableAdapter1  {   // prijavit se na nek dogodek EndInit()  ??? in zamenjat connstring   }}}partial class TableAdapter1  {   // prijavit se na nek dogodek EndInit()  ??? in zamenjat connstring   }}}   // prijavit se na nek dogodek EndInit()  ??? in zamenjat connstring   }}}

AndrejT
AndrejT - ponedeljek, 05. februar 2007

Aleš,TableAdapter bo vedno prebral connection string iz pripadajoče konfiguracijske datoteke, v tem primeru web.config. Tudi če imaš connection string nastavljen v drugem projektu/dll-ju, ga lahko prekopiraš v web.config - pazi le, da se ime connection stringa v web configu ujema s tistim v originalni konfiguracijski datoteki (ime vključuje imenski prostor projekta ipd...)Če pa želiš table adapterju connection string nastaviti "ročno", moraš adapterju najprej nastaviti lastnost ConnectionModifier na npr. Public (to storiš v urejevalniku dataseta) - s tem bo v table adapterju lastnost Connection postala "vidna", torej jo boš lahko dostopal skozi svojo kodo. Pazi le, da boš connection string nastavil, preden jo table adapter uporabi. Pametno je tudi, da preprečiš shranjevanje privzete vrednosti nastavitev (connection stringa) v kodi, s čimer se izogneš, da bi v produkciji aplikacija "slučajno" uporabila razvojni connection string. To storiš tako, da pri v oknu z nastavitvami (Settings) izbereš svoj connection string in med lastnostmi nastaviš GenerateDefaultValueInCode na false.

Aleš Gaber
Aleš Gaber - ponedeljek, 05. februar 2007

Kako pa TableAdapterju spremeniš Connection String? Ne razumem ravno, kako lahko spremenim conn string, ki ga določi designer pri kreiranju dataset-a oz. tableadapterja.Verjetno obstaja kak dogodek, kjer bi conn.string zamenjal s tistim v web configu? Iz designerja..[System.Diagnostics.DebuggerNonUserCodeAttribute()]private void InitConnection() {  this._connection = new IBM.Data.DB2.DB2Connection();  this._connection.ConnectionString = global::WindowsApplication1.Properties.Settings.Default.XXXConnectionString;}

pril
pril - ponedeljek, 05. februar 2007

Sam uporabljam self-made knjižnjico, ki pobira podatke iz web.config datoteke, med drugim tudi podatke za connection string, ki je lahko kodiran z lastno enkripcijo ali pa tudi ne (program to sam razpozna, običajno imam kodiran samo username/password). Connection string imam običajno razbit na več podatkov (server, username/password, initial catalog....) Po dostopu do baze podatkov preveri še če ima baza tabelo webconfig (lahko tudi kako drugo ime definirano v web.config datoteki) in pogleda še podatke od tam - če so ključi enaki kot v web.config datoteki jih povozi, drugače jih doda. Zelo koristno za enostavno kopiranje projektov/datotek med razvojnim-testnim-produkcijskim okoljem, za lastne grozde strežnikov ipd. Knjižnica uporablja lasten cache za hiter dostop do podatkov, poleg tega imajo nekaj razširjenih možnosti (podpora za nize podatkov ipd) lp, pl

bojanv
bojanv - ponedeljek, 05. februar 2007

Jz mam vse conn stringe v web configu, kjer jih pole preko WebConfigurationManager-ja nastavim v enem dllju, ki ga mam za Help razrede pa preko staticnih spremenljivk dostopam preko njih v DAL, BL itd. Web config mam pa kriptiran....