Avatar billede poul10 Nybegynder
21. juli 2011 - 11:51 Der er 12 kommentarer og
1 løsning

Environment defineres fra PL til DAL

Hej med jer,
Jeg sidder lidt og roder med Repository Pattern og vil gerne være i stand til at definere mit "Environment" fra PL til DAL
Fx når jeg åbner mit program, så vil jeg gerne kunne vælge om jeg køre DEV, TEST eller PROD og så sætte fx connectionstring udfra dette valg.

Jeg har lavet 3 conenctionstrings i min app.config men hvordan får jeg fortalt mit DAL at jeg kører i DEV uden at skulle sende det med som en parametre hele vejene igennem BL til DAL?
Jeg prøvede at bruge Environment.SetEnvironmentVariable("conn", "DEV") og så læse denne i mit DAL.
Noget ala

Dim env As String = System.Environment.GetEnvironmentVariable("conn")

    Select Case env
      Case "DEV"
        Return ConfigurationManager.ConnectionStrings("connStringDEV").ConnectionString
    End Select

Men kunne godt tænke mig at høre hvordan i gør det? Skal ikke sende mit "Environment" med rundt i hele systemet som parametre i hvert fald
Avatar billede bildsoe Nybegynder
21. juli 2011 - 12:39 #1
Det vil jeg også gerne vide! Er der nogen måde at man kan markere at man gerne vil følge et spørgsmål uden at skulle skrive en kommentar?
Avatar billede arne_v Ekspert
21. juli 2011 - 17:12 #2
Der er en lille checkbox forneden "overvåg denne tråd" - hvis den er checket af og du klikker "opret" saa ...
Avatar billede arne_v Ekspert
21. juli 2011 - 17:15 #3
Givet at du oensker manuelt at vaelge, saa tror jeg at det paenest er at sende information med ned gennem lagene.

Alternativet er en singleton som tilgaaes fra alle lag.
Avatar billede janus_007 Nybegynder
21. juli 2011 - 18:43 #4
Du kan løse det ved at have flere configs, det er nok den mest almindelige måde og faktisk også den simpleste :), men ikke nødvendigvis den mest fleksible, men hold det simpelt så længe du kan :)

Dvs. drop connStringDEV, brug kun connString. Definér denne i en ConnectionString.config for dev og igen for test og prod :)

eks.vis så på test ligger du ConnectionString.config med den connection du bruger til test og så fremdeles :)

Din Web.Config skal være den samme sådan at den er nem at rette i, men du skal så tilføje flg. sådan at dine miljøafhængige configs læses:

<configuration>
  <appSettings file="ConnectionString.config">
  </appSettings>
  ...
</configuration>
Avatar billede poul10 Nybegynder
22. juli 2011 - 09:28 #5
Janus:
Det er en winforms app jeg roder med, så ved ikke om jeg kan bruge det du skriver. Jeg har et applikation hvor jeg vælger mit environment når jeg starter op, ikke en webserver hvor jeg har 3 forskellige miljøer, eller misforstår jeg?

Arne:
Jeg har lavet noget ala dette nu:

Sub Main()
Const env As MitEnvironment = MitEnvironment.Development
  Dim repository As New CarRepository(env)
  Dim carBusiness As New CarBusiness(repository)
  Dim cars As List(Of Car) = carBusiness.GetCars()

I CarBusiness:
  Public Function GetCars() As List(Of Car)
    Return _carRepository.GetCars()
  End Function

I CarRepository:
    Private ReadOnly _database As Database

    Public Sub New(ByVal env As MitEnvironment)
      _database = New Database(env)
    End Sub
   
    Public Function GetCars() As List(Of Car) Implements ICarRepository.GetCars
    //bla bla henter data
    _database.ExecuteReader(sql)

I min database klasse:

  Public Function ExecuteReader(ByVal sql As String) As SqlDataReader
    If _conn IsNot Nothing Then
      _conn.Close()
    End If

    _conn = New SqlConnection(GetConnectionString())
    _conn.Open()
    _cmd = New SqlCommand(sql, _conn)

    Return _cmd.ExecuteReader()
  End Function

  Public Function GetConnectionString() As String
    Dim result As String = String.Empty

    Select Case _env
    Case EGEnvironment.UnitTest
        Throw New NotImplementedException()
      Case EGEnvironment.Development
        result = ConfigurationManager.ConnectionStrings("connString").ConnectionString
      Case EGEnvironment.Production
        Throw New NotImplementedException()
    End Select

    Return result
  End Function
   
Giver det mening? Ved godt det er meget nede på jorden men vil gerne have styr på fundamentet i mit program :)
Avatar billede bildsoe Nybegynder
22. juli 2011 - 10:03 #6
@Arne_v - yes har fundet checkboxen, tænkte mere på, om der var en måde man kunne registrere at man vil følge en tråd, uden at skulle kommentere og sætte kryds i checkboxen.
Avatar billede arne_v Ekspert
22. juli 2011 - 16:33 #7
@bildsoe

Jeg kender ikke et nemmere alternativ.
Avatar billede arne_v Ekspert
22. juli 2011 - 16:37 #8
@poul

Det er lidt svaert at foelge din kode, mende ngrundliggende ide ser OK ud, men der er nogle detaljer som undrer mig:

Const env As MitEnvironment = MitEnvironment.Development

?

    Select Case _env
    Case EGEnvironment.UnitTest
        Throw New NotImplementedException()
      Case EGEnvironment.Development
        result = ConfigurationManager.ConnectionStrings("connString").ConnectionString
      Case EGEnvironment.Production
        Throw New NotImplementedException()
    End Select

?
Avatar billede poul10 Nybegynder
22. juli 2011 - 18:30 #9
Hov, de skal selvfølgelig hedde det samme :)
Men ellers er det OK siger du, det er da rart.

Ville du vælge den løsning fremfor en singleton?
Avatar billede arne_v Ekspert
22. juli 2011 - 20:56 #10
Jeg vil klart foretraekke at sende informationen ned gennem lagene fremfor at gemme dem i en singleton som tilgaaes fra forskellige lag.
Avatar billede poul10 Nybegynder
23. juli 2011 - 00:17 #11
Jamen super, så fik jeg jo svar på mit spørgsmål..
Smid et svar arne :)
Avatar billede arne_v Ekspert
23. juli 2011 - 00:21 #12
svar
Avatar billede arne_v Ekspert
11. september 2011 - 23:40 #13
saa mangler du bare at acceptere
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
Kurser inden for grundlæggende programmering

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