27. maj 2004 - 15:29Der er
12 kommentarer og 1 løsning
Deling af værdi på tværs af klasser
Hvordan "deler" man smartest værdier, så som konstanter, på tværs af classes?
Jeg har delt min web applikation op efter den klassiske 3-tier model, og har lavet mit forretningslogik-lag af en masse classes. Jeg kunne godt tænke mig at disse classes har adgang til en række "konstanter", så som DSN-streng, SMTP-serveradresse osv. osv.
Hvordan gør man det smartest?
Mit lag er defineret som et "Class Library" i Visual Studio, og har derfor ikke umiddelbart adgang til (tror jeg) web.config osv., hvor man vist normalt placerer denne slags oplysninger.
Flere kommuner går nu i gang med at bruge AI-understøttet dokumentation. Målet er, at sagsbehandlere skal bruge mindre tid på referater og registrering – og mere tid på nærvær i mødet med borgeren.
Jeg har prøvet at lave en seperat class med alle mine konstanter, som de andre classes så "Inherits" (ved ikke om det er den rigtige måde at gøre det på).
Problemet er så bare at konstanterne så bliver "synlige" fra præsentationslaget (og via VS' IntelliSense), hvilket irriterer mig voldsomt.
Her er et eks. på noget som du måske kan bruge. En config klasse: Public Class Config
Private _smtp As String = String.Empty Private _mailerrorfrom As String = String.Empty Private _mailerrorto As String = String.Empty Private _host As String Private _connectionString As String Private _cssStyle As String
Private Shared _config As Config
Private Sub New() Try _smtp = System.Configuration.ConfigurationSettings.GetConfig("dotnetforum")("SMTP") _host = System.Configuration.ConfigurationSettings.GetConfig("dotnetforum")("HOST") _connectionString = System.Configuration.ConfigurationSettings.GetConfig("dotnetforum")("SQLDB") _cssStyle = _host & System.Configuration.ConfigurationSettings.GetConfig("dotnetforum")("STYLE") _mailerrorfrom = System.Configuration.ConfigurationSettings.GetConfig("dotnetforum")("MAILERRORFROM") _mailerrorto = System.Configuration.ConfigurationSettings.GetConfig("dotnetforum")("MAILERRORTO") Catch ex As Exception Throw New Exception("Error loading configuration", ex) End Try
End Sub
''' ----------------------------------------------------------------------------- ''' <summary> ''' ''' ''' </summary> ''' <returns></returns> ''' <remarks> ''' </remarks> ''' <history> ''' [morten] 20-05-2004 Created ''' </history> ''' ----------------------------------------------------------------------------- Public Shared Function Instance() As Config If _config Is Nothing Then _config = New Config End If Return _config End Function
''' ----------------------------------------------------------------------------- ''' <summary> ''' ''' ''' </summary> ''' <value></value> ''' <remarks> ''' </remarks> ''' <history> ''' [morten] 20-05-2004 Created ''' </history> ''' ----------------------------------------------------------------------------- Public ReadOnly Property ConnectionString() As String Get Return _connectionString End Get End Property
''' ----------------------------------------------------------------------------- ''' <summary> ''' ''' ''' </summary> ''' <value></value> ''' <remarks> ''' </remarks> ''' <history> ''' [morten] 20-05-2004 Created ''' </history> ''' ----------------------------------------------------------------------------- Public ReadOnly Property CssStyle() As String Get Return _cssStyle End Get End Property
''' ----------------------------------------------------------------------------- ''' <summary> ''' ''' ''' </summary> ''' <value></value> ''' <remarks> ''' </remarks> ''' <history> ''' [morten] 20-05-2004 Created ''' </history> ''' ----------------------------------------------------------------------------- Public ReadOnly Property Smtp() As String Get Return _smtp End Get End Property
''' ----------------------------------------------------------------------------- ''' <summary> ''' ''' ''' </summary> ''' <value></value> ''' <remarks> ''' </remarks> ''' <history> ''' [morten] 20-05-2004 Created ''' </history> ''' ----------------------------------------------------------------------------- Public ReadOnly Property FromAddress() As String Get Return _mailerrorfrom End Get End Property
''' ----------------------------------------------------------------------------- ''' <summary> ''' ''' ''' </summary> ''' <value></value> ''' <remarks> ''' </remarks> ''' <history> ''' [morten] 20-05-2004 Created ''' </history> ''' ----------------------------------------------------------------------------- Public ReadOnly Property ToAddress() As String Get Return _mailerrorto End Get End Property
''' ----------------------------------------------------------------------------- ''' <summary> ''' ''' ''' </summary> ''' <value></value> ''' <remarks> ''' </remarks> ''' <history> ''' [morten] 20-05-2004 Created ''' </history> ''' ----------------------------------------------------------------------------- Public ReadOnly Property Host() As String Get Return _host End Get End Property End Class
Denne konfig klasse bruger du så på følgende måde i dit projekt: Public Shared Sub Send(ByVal Message As String) If Message Is Nothing OrElse Message.Length = 0 Then Throw New ArgumentNullException("Message is Nothing", "Message") End If Try Dim m As New System.Web.Mail.MailMessage m.From = dotnetforum.Framework.Configuration.Config.Instance.FromAddress m.To = dotnetforum.Framework.Configuration.Config.Instance.ToAddress m.Subject = "Fejl på dotnetforum - host: " & dotnetforum.Framework.Configuration.Config.Instance.Host m.Body = Message System.Web.Mail.SmtpMail.SmtpServer = dotnetforum.Framework.Configuration.Config.Instance.Smtp System.Web.Mail.SmtpMail.Send(m) Catch ex As Exception 'For now just eat End Try End Sub
Jeg tror du HAR adgang til din web.config. Hvis dine klasser bliver til en dll der ligger i /bin og din web.config ligger i / er alt som det skal være, og du kan hente de værdier fra web.config som du har lyst til.
Men et lille sidespørgsmål så: Kan man bygge "intelligens" ind i web.config? F.eks. er det tit nødvendigt at bruge lidt Server.MapPath i forbindelse med DSN-strengen, og jeg plejer også at lave lidt script der indlæser nogle forskellige indstillinger automatisk (f.eks. SMTP server) alt efter om man befinder sig i udviklingsmiljøet eller på driftsserveren.
Jeg plejer at lave en statisk Settings-klasse som henter værdierne ud fra web.config. På den måde kan jeg lige kode lidt på værdierne før jeg returnerer dem. Ala:
public class Settings { public static string ConnectionString { get { string connStr = System.Configuration.ConfigSettings.AppSettings["ConnectionString"]; // Eller hvordan det nu er. connStr = connStr.Replace("www.server1.dk", "www.server2.dk"); return connStr; } } }
Man må jo sige at nielsbrinch´s svar er en lidt 'skrabet' udgave af mit forslag. Min løsning arbejder ud fra et design patterne der hedder Singleton. Det arbejder også ud fra en filosofi om at det er en 'dårlig' idé at bruge AppSettings til at holde værdier. For hvad nu hvis et andet komponent også bruger AppSettings til at holde sine værdier - og også har valgt at have en key der hedder BaseUrl? Så holder den ikke længere. Det er selvfølgelig ikke nogen grund til at tænke over det hvis det er et lille site, men hvis man vil være sikker på man ikke kommer i problemer senere når man skal udvide er det altdi en god idé at lave sin egen Config sektion.
quidmaster, jeg vil give dig ret i at det er pænere at lægge sine indstillinger i sin egen sektion i web.config. Men jeg betragter det du beskriver som et teoretisk problem. Ikke et egentligt problem. Vil du ikke give mig ret i at det forholder sig sådan?
nielsbrinch> Jeg vil tldels give dig ret hvilket jeg jo også gør i ovenstående. Problemet er jo at hvis man sidder flere og udvikler på et system. 2 sidder og laver nogle dataaccess klasser. Den ene skal snakke med de interne ordre systemer mens den anden skal snakke med den databaser der indeholder websitet. Kan du se problemet i at de begge gerne vil have en key i AppSettings? Det bliver hurtigt en uoverskuelig og ikke ligefrem pæn måde at håndtere denne form for data. Endnu værre er det hvis man laver komponenter som andre (eksterne) skal bruge - så er det jo ikke ligefrem nogen lykke hvis dette komponent lægge beslag på eks. key´en connectionstregn i AppConfig.....mon ikke der også er andre der har brugt den key? Muligheder er der ihvertfald ;) Så om det er et teoretisk problem kommer vel an på hvad man laver.
Synes godt om
Ny brugerNybegynder
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.