21. juli 2011 - 11:51Der 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
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:
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 :)
@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.
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
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.