Avatar billede soerens Nybegynder
27. maj 2004 - 15:29 Der 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.

/SoerenS
Avatar billede jakobg Nybegynder
27. maj 2004 - 15:45 #1
Du kan lave en class med shared konstanter, det er vist dét du er ude efter. Koder du i VB.Net?
Avatar billede soerens Nybegynder
27. maj 2004 - 15:52 #2
jakobg > Ja.

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.
Avatar billede jakobg Nybegynder
27. maj 2004 - 16:02 #3
Læg et namespace omkring din class, på den måde kan du få lidt styr på IntelliSense.

namespace Test
class clsTest ...
end namespace

Ellers vil jeg mene, at nedarvning, som du gør, er den helt rigtige måde at gøre det på.
Avatar billede guidmaster Nybegynder
27. maj 2004 - 19:30 #4
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
Avatar billede nielsbrinch Nybegynder
27. maj 2004 - 22:04 #5
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.
Avatar billede soerens Nybegynder
28. maj 2004 - 09:59 #6
nielsbrinch > Jeg tror faktisk du har ret...

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.
Avatar billede jakobg Nybegynder
28. maj 2004 - 10:09 #7
Nej, der kan ikke ligges kode ala "if-then-else" ind i web.config.
Avatar billede nielsbrinch Nybegynder
28. maj 2004 - 16:05 #8
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;
    }
  }
}
Avatar billede nielsbrinch Nybegynder
28. maj 2004 - 16:11 #9
Eller et bedre eksempel:

public static string BaseUrl
{
  get
  {
    return System.Configuration.ConfigSettings.AppSettings["BaseUrl"];
  }
}

public static string ImageUrl
{
  get
  {
    return Settings.BaseUrl+System.Configuration.ConfigSettings.AppSettings["ImagePath"];
  }
}
Avatar billede soerens Nybegynder
03. juni 2004 - 10:50 #10
Tak for hjælpen/inspirationen!

nielsbrinch var den eneste der lagde et svar, så point til ham. Min endelige løsning kommer nok også til at ligne hans forslag mest.

/SoerenS
Avatar billede guidmaster Nybegynder
03. juni 2004 - 11:20 #11
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.
Avatar billede nielsbrinch Nybegynder
03. juni 2004 - 23:41 #12
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?
Avatar billede guidmaster Nybegynder
04. juni 2004 - 00:19 #13
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.
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

IT-JOB

Forsvarsministeriets Materiel- og Indkøbsstyrelse

Cyberdivisionen søger leder til Lokal IT Servicecenter i Holstebro

KMD A/S

Projektleder

Capgemini Danmark A/S

AI/Data Engineer

Forsvarsministeriets Materiel- og Indkøbsstyrelse

Cyberdivisionen søger analytisk stærk og erfaren medarbejder i Hvidovre