Avatar billede olehaahr Nybegynder
30. oktober 2012 - 20:51 Der er 14 kommentarer

Initialisere connectionstring i assembly

Hej,

Jeg har lavet mig et assembly (dll-fil), som indeholder en række klasser som er public.

Dybt nede i maven på assemblyet har jeg en internal klasse som er ansvarlig for adgangen til databasen. Denne klasse har brug for en connectionstreng. (Denne ændrer sig ikke, når den først er blevet inialiseret)

Da klassen er internal, kan de programmører som bruger mit assembly, ikke tilgå den direkte.

Men de skal kunne angive connectionstrengen. Jeg kan selvfølgelig lade strengen "boble hele vejen ned" fra mine public klasser til den internal klasse, hver gang jeg skal bruge den men dette virker ikke smart.

Mit assembly kender i sagens natur ikke de andre programmørers kode, så jeg kan ikke kalde en af deres klasser, globale variable eller lignende.

Jeg overvejer at lave en public singleton-funktion, som skal "holde" connectionstrengen. Denne kan de andre programmører så kalde fra deres kode, og initialisere. Og jeg kan kalde den fra min internal funktion.

Lyder det fornuftigt, eller er der en bedre måde at sende connectionstrengen ned i maven på mit assembly, ved initialisering af programmet ?

Mvh Ole
Avatar billede Syska Mester
30. oktober 2012 - 21:29 #1
Hvorfor ikke lade din app læse en connectionString fra en app.config fil. Det ville klart være det nemmeste?
Avatar billede olehaahr Nybegynder
30. oktober 2012 - 21:36 #2
nemmest ja...

Men jeg synes ikke at det er særlig elegant. Min assembly vil (forhåbentlig/måske) blive brugt af andre programmører i deres programmer. Jeg kender jo ikke deres app.config, og kan ikke bestemme over den.


Jeg mener da at det er pænere at de enkelte programmører selv er ansvarlig for, hvordan connectionstring skal gemmmes i deres kode (app.config, hardcodet,etc). De skal bare kunne "give" den til mig.


Mvh Ole
Avatar billede Syska Mester
30. oktober 2012 - 21:49 #3
Du vil ikke udstille din klasse som skal bruge den connectionString, der har du allerede bestemt noget for brugeren af systemet.

connectionString i en app.config/web.config er meget normalt ... så det kan jeg ikke se problemet i.

Du kan også lade din assembly lede efter en klasse som implementere "dit" interface.

public IConnectionString
{
string ConnstringString{get;}
}

og på den måde kan dem som vil bruge din assembly selv bestemme hvordan de vil give dig den ... hardcoded eller via app.config.

Der er mange muligheder ...

Du kan også lade dem sætte en static property som det første i deres app ... noget som asp.net mvc gør brug af til deres viewengines og andre ting.

Men der vil altid være et eller andet bootstrap for at starte det hele ...
Avatar billede Syska Mester
30. oktober 2012 - 21:51 #4
Men sagt på en anden måde ... så må du jo give dem flere muligheder for at "give" dig den ...

app.config via et specielt navn som henviser til din assembly ... er den tom ... så kig efter andre muligheder.

Lave flere strategies for at finde en connnectionString ....
Avatar billede Syska Mester
30. oktober 2012 - 21:54 #5
Hvis du kender DI/IOC ... så kan du jo lede efter assemblies som implementere.

interface ISearchForConnectionString
{
int Priority{get;}
bool IsValid(); // return true if this has a valid connnectionString
string ConnectionString{get;} // return the CS
}

og så en runner til overstående som tager den vigtigste ISearchForConnectionString først ... og løber dem igennem indtil den finder en valid.

Overstående er kun ideer ... men at slippe for config ... det er vist aldrig sket før ... :-)
Avatar billede olehaahr Nybegynder
30. oktober 2012 - 22:16 #6
Ok !

Jeg lader spørgsmålet stå åbent lidt endnu.
Det kan jo være at andre har en kommentar.

Mvh Ole
Avatar billede Syska Mester
30. oktober 2012 - 22:45 #7
Helt sikkert ...

Jeg håber i hvert fald de tænker i samme retning som mig :-)

mvh
Avatar billede arne_v Ekspert
31. oktober 2012 - 04:19 #8
Konfiguration lyder ret oplagt.

En connection string er ikke en software udvikler ting, men en system administartor ting.

Hvis den paagaeldende database skal flyttes over paa en anden SQLServer p.g.a. diverse kapacitets justeringer, saa er det meget skidt hvis det kraever en software aendring.

At gemme i og hente fra en singleton goer som udgangspunkt koden vanskeligere at laese, da det ikke er indlysende hvor der gemmes og hvor der hentes.

At sende noget ned som argument er normalt at foretraekke.

Singleton til dette formaal boer vaere sidste udvej.
Avatar billede olehaahr Nybegynder
31. oktober 2012 - 07:02 #9
Spørgsmålet er nu ikke så meget "konfigurationsfil eller ej", men mere: "Hvem skal læse konfigurationsfilen ?".

Skal mit assembly læse den, med tilhørende krav til navngivning af parameter m.m ?

Eller skal "slutprogrammøren" læse den og så initialiseret mit assembly med den?

Jeg er enig med jer begge i, at den slags oplysninger jo aldrig skal hardcodes.

Nu var det med configurationsstrengen bare eet eksempel. Men der kunne være mange andre eksempler på, at man ønsker at sætte nogle "assembly globale" variable ved initialisering af assemblyet.

Så spørgsmålet gik ligeså meget på, hvordan man bedst muligt kunne initialisere sådanne variable.

Mvh Ole
Avatar billede Syska Mester
31. oktober 2012 - 10:07 #10
EF, NHibernate og mange andre ... har stragegies for det ...

EF har en måde jeg godt kan lide ...

public class TestDbContext : DbContext
{}

DbContext har et par strageties ... sat global eller i web.config.

En af dem er at kigge efter en connnectionString efter klassens navn, altså: "TestDbContext".

Sidste er vist at bruge en localdb ...
Avatar billede arne_v Ekspert
31. oktober 2012 - 23:14 #11
Hvis vi snakker et meget lille system - lad os sige <25 klasser, saa giver det nok mest mening at laese konfig et sted og sende argumenter med over i metode kald.

Hvis vi snakker et realistisk stoerrelse system, saa giver det mening at lade hver komponent/del/lag laese sin egen konfiguration.

Hvis det inden for en enkelt komponent/del/lag er rigtigt mange klasser som skal bruge den konfig (naeppe relevant for connection string), saa kan man overveje en readonly singleton.
Avatar billede olehaahr Nybegynder
01. november 2012 - 07:45 #12
Ok.

Smid et svar begge 2 - så deler i points...

Mvh Ole
Avatar billede Syska Mester
01. november 2012 - 08:32 #13
Svar.

Men du må gerne poste din løsning ... så kan vi se om vi kan optimere den.
Avatar billede arne_v Ekspert
01. november 2012 - 12:50 #14
svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester