Avatar billede websam Nybegynder
18. november 2005 - 16:12 Der er 24 kommentarer og
1 løsning

Cache af arraylist der ikke helt virker ?

Hejsa,

Jeg har lavet en function der skal lave en cache af en arrayliste, men jeg får en fejl på det.

        Public Function LoadAll()
            Dim Source As ArrayList = CType(HttpContext.Current.Cache("LoadAllTeam"), ArrayList)
            If Source Is Nothing Then
                Source = iFaceData.GetAllTeam
                HttpContext.Current.Cache.Insert("LoadAllTeam", Source)
            Else
                Source = HttpContext.Current.Cache("LoadAllTeam")
            End If
            Return Source
        End Function

Det giver en fejl der lyder på :

Object reference not set to an instance of an object.

i denne linie :

Source = iFaceData.GetAllTeam

Metoden der henvises til er følgende :

        Public Function GetAllTeam() Implements iBookingData.GetAllTeam
            Dim objConn As OleDbConnection = objDb.AccessConnect
            Dim objComm As New OleDbCommand("Select * From tbl_booking Order By TeamTime", objConn)
            Dim Rs As OleDbDataReader = objComm.ExecuteReader
            Dim objList As New ArrayList
            While Rs.Read()
                Dim objProperties As New BookingProperty
                objProperties.TeamId = Rs.GetInt32(0)
                objProperties.TeamName = Rs.GetString(1)
                objProperties.TeamDay = Rs.GetString(2)
                objProperties.TeamTime = Rs.GetString(3)
                objProperties.TeamMax = Rs.GetInt32(4)
                objList.Add(objProperties)
            End While
            objDb.AccessClose()
            Return objList
        End Function

Er der en der kan forklare mig hvad jeg gør forkert ?

/Websam
Avatar billede arne_v Ekspert
18. november 2005 - 22:20 #1
bliver iFaceData initialiseret ?
Avatar billede websam Nybegynder
18. november 2005 - 22:24 #2
Ja det laver jeg med Dim iFaceData As iBookingData, har den bare ikke med i udplukket af koden. Ved debug skriver den godt nok at iFaceData = Nothing, men bruger jeg den uden for cache virker det godt nok !?!

/Websam
Avatar billede arne_v Ekspert
18. november 2005 - 22:30 #3
Dim iFaceData As iBookingData

skal nok være

Dim iFaceData As iBookingData = New EnKlasseSomImplementererInterface

eller

Dim iFaceData As iBookingData = EnFactoryKlassse.EnSharedMetodeSomGiverEnKlasseSomImplementererInterface
Avatar billede websam Nybegynder
18. november 2005 - 22:58 #4
Så skal jeg kalde klassen hvor jeg har mine metoder som snakker med databasen hvori jeg Implenetere interfacet :

Dim iFaceData As MinDataKlasse = New MinDataKlasse

For hvis dette er tilfældet så kan jeg ikke se hvad jeg skal bruge mit interface til andet end at sikre mig at de definerede metoder i mit interface også er til stede i min dataklasse ?

/Websam
Avatar billede arne_v Ekspert
18. november 2005 - 23:01 #5
det gør at du kan erstatte implementation ved kun at rette den ene linie

hvis du bruger en factory (som jeg gjorde i det eksempel for lang tid siden), så
er det selvfølgelig endnu bedre encapsulated

men det andet er en start
Avatar billede websam Nybegynder
18. november 2005 - 23:04 #6
Hvilken linie er det du snakker om her ?
Avatar billede websam Nybegynder
18. november 2005 - 23:21 #7
Ok prøv lige at tjekke disse klasse igennem og se om jeg har fat i det rigtige, jeg har kun lige ladet en enkel metode være i klasserne for at gøre det lidt mere overskueligt :

Interface klasse :

Namespace Booking
    Class BookingInterface
        Public Interface iBookingData
            Function GetAllTeam()
        End Interface
    End Class
End Namespace

Data klasse :

Imports System
Imports System.Data
Imports System.Data.OleDb
Imports Svoemmehal.Booking.BookingInterface

Namespace Booking
    Public Class BookingData
        Implements iBookingData
        Dim objDb As DbClass = New DbClass

        '// <summary>
        '// Metode der henter alle hold.
        '// </summary>
        Public Function GetAllTeam() Implements iBookingData.GetAllTeam
            Dim objConn As OleDbConnection = objDb.AccessConnect
            Dim objComm As New OleDbCommand("Select * From tbl_booking Order By TeamTime", objConn)
            Dim Rs As OleDbDataReader = objComm.ExecuteReader
            Dim objList As New ArrayList
            While Rs.Read()
                Dim objProperties As New BookingProperty
                objProperties.TeamId = Rs.GetInt32(0)
                objProperties.TeamName = Rs.GetString(1)
                objProperties.TeamDay = Rs.GetString(2)
                objProperties.TeamTime = Rs.GetString(3)
                objProperties.TeamMax = Rs.GetInt32(4)
                objList.Add(objProperties)
            End While
            objDb.AccessClose()
            Return objList
        End Function
    End Class
End Namespace

Buisness klasse

Imports System
Imports System.Web

Namespace Booking
    Public Class BookingBiz
        Dim iFaceData As BookingData = New BookingData

        '// <summary>
        '// Metode der henter alle hold fra databasen igennem interfacet.
        '// </summary>
        '// <param="CustomerId"></param>
        Public Function LoadAll()
            'Dim Context As HttpContext = HttpContext.Current
            Dim Source As ArrayList = CType(HttpContext.Current.Cache("Text_GroupBy"), ArrayList)
            If Source Is Nothing Then
                Source = iFaceData.GetAllTeam
                HttpContext.Current.Cache.Insert("LoadAllTeam", Source)
            Else
                Source = HttpContext.Current.Cache("LoadAllTeam")
            End If
            Return Source
        End Function
    End Class
End Namespace

Property klasse

Namespace Booking
    Public Class BookingProperty
        Dim iFaceData As BookingData = New BookingData
        Private _TeamId As Integer
        Private _TeamName As String
        Private _TeamDay As String
        Private _TeamTime As String
        Private _TeamMax As Integer

        '--- Public properties der håndtere de private variabler.
        Public Property TeamId() As Integer
            Get
                Return _TeamId
            End Get
            Set(ByVal Value As Integer)
                _TeamId = Value
            End Set
        End Property

        Public Property TeamName() As String
            Get
                Return _TeamName
            End Get
            Set(ByVal Value As String)
                _TeamName = Value
            End Set
        End Property

        Public Property TeamDay() As String
            Get
                Return _TeamDay
            End Get
            Set(ByVal Value As String)
                _TeamDay = Value
            End Set
        End Property

        Public Property TeamTime() As String
            Get
                Return _TeamTime
            End Get
            Set(ByVal Value As String)
                _TeamTime = Value
            End Set
        End Property

        Public Property TeamMax() As Integer
            Get
                Return _TeamMax
            End Get
            Set(ByVal Value As Integer)
                _TeamMax = Value
            End Set
        End Property

        '// <summary>
        '// Metode der sætter default value på variabler.
        '// </summary>
        Private Sub PopulateTeam()
            _TeamId = 0
            _TeamName = ""
            _TeamDay = ""
            _TeamTime = ""
            _TeamMax = 0
        End Sub

        '// <summary>
        '// Default konstrukter der kalder PopulateUser.
        '// </summary>
        Public Sub New()
            PopulateTeam()
        End Sub

        '// <summary>
        '// Overload konstrukter der sender bruger til redigering eller sletning.
        '// </summary>
        Public Sub New(ByVal TeamId As Integer)
            '--- Tjekker om id'et er med
            If TeamId > 0 Then
                Dim listUser As String = iFaceData.GetOneTeam(TeamId)
                Dim arrUser() As String = listUser.Split(";".ToCharArray)
                _TeamId = Convert.ToInt32(arrUser(0))
                _TeamName = arrUser(1)
                _TeamDay = arrUser(2)
                _TeamTime = arrUser(3)
                _TeamMax = arrUser(4)
            Else
                PopulateTeam()
            End If
        End Sub
    End Class
End Namespace

Er det helt hen i vejret det her ???

/Websam
Avatar billede arne_v Ekspert
18. november 2005 - 23:31 #8
drop Class BookingInterface et Interface kan være ude på samme niveau som en Class
Avatar billede arne_v Ekspert
18. november 2005 - 23:32 #9
Dim iFaceData As BookingData = New BookingData

skal være

Dim iFaceData As iBookingData = New BookingData
Avatar billede arne_v Ekspert
18. november 2005 - 23:35 #10
din business klasse er meget passthrough og ikke særligt business orienteret,
men det deler den med mange andre - der kan også komme mere kød på senere
Avatar billede websam Nybegynder
18. november 2005 - 23:39 #11
Du skriver "det gør at du kan erstatte implementation ved kun at rette den ene linie" men hvad er det for en linie du snakker om der ?

/Websam
Avatar billede arne_v Ekspert
18. november 2005 - 23:42 #12
Dim iFaceData As iBookingData = New BookingData

som kan erstattes af

Dim iFaceData As iBookingData = New SomeOtherClassThatImplementsTheInterface
Avatar billede websam Nybegynder
18. november 2005 - 23:48 #13
Ok på den facon ;o)

Som jeg har forstået det med en buisness klasse, så skal den håndtere alt det der ikke har noget disideret med database tilgang som f.eks. chacing, kryptering, validering, beregninger ect.

Men som så meget andet har jeg da sikkert slugt det forkert oxo *GGG*, men du skal være velkommen til at udvide min horisont eller rette mig hvis ikke jeg har ret i ovenstående ?

/Websam
Avatar billede arne_v Ekspert
18. november 2005 - 23:52 #14
en forretnings logik klasse laver surprise surprise forretnings logik

:-)

validering og beregning er typiske forretnings logik funktionaliteter

caching og kryptering falder ikke helt så naturligt i den kategori

men de kan placeres i det lag hvis der er grund til det
Avatar billede websam Nybegynder
18. november 2005 - 23:57 #15
Ok så havde jeg da fat i noget af det :o0

Men hvis ikke jeg skulle lave min caching/kryptering i buisness laget hvor skulle det så komme ind henne ? Vel ikke i mit design lag ?
Avatar billede websam Nybegynder
19. november 2005 - 00:01 #16
Og mener du så bare at jeg f.eks. skulle trække data direkte fra mit data lag over i mit design lag og så springe buisness delen over når jeg blot vil hente data til visning i f.eks. et datagrid ?

For det virker da for mig som værende i den forkerte retning ?

/Websam
Avatar billede arne_v Ekspert
19. november 2005 - 00:01 #17
caching kan vel laves i business lag eller i datalag (GetAllTeam kunne gemme en
kopi så den ikke skulle i DB hver gang)
Avatar billede arne_v Ekspert
19. november 2005 - 00:02 #18
kryptering vil typisk ligge helt uden for din applikation f.eks. browser og
IIS kører HTTPS uden at din kode gør noget
Avatar billede arne_v Ekspert
19. november 2005 - 00:04 #19
der er ikke noget helligt ved 3 lag (faktisk foretrækker jeg at tale om 4 lag)

hvis dit forretnings logik lag er ren passthrough *OG* du er er sikker på at
det bliver det ved med at være, så kan du roligt eliminere det

men mens små demo eksempler næsten altid ender op med et passthrough forretnings
logik lag så er det noget mere sjældent i en realistisk applikation
Avatar billede arne_v Ekspert
19. november 2005 - 00:07 #20
den her kode viser noget

men du skal vel også have noget kode til at opdatere

der er sikkert nogle regler for data validering

og måske skal du lige have 2 kategorier brugere: dem der kun kan læse
og dem som også må opdatere

og ...
Avatar billede websam Nybegynder
19. november 2005 - 00:20 #21
Nu er den kryptering jeg lige tænker på til f.eks. passwords hvor jeg i den forbindelse laver noget md5 til login på et admin modul eller et community som eksempel. Her vil jeg jo ikke benytte mig https over browser/IIS med sertifikat osv.

Og et eller andet sted skal jeg jo lave valideringen af det indtastede op i mod det der måtte ligge i databasen, eller ved oprettelse af en ny bruger skal der jo laves md5 på passwordet og det kan jeg ikke se hvorfor det ikke skulle ligge buisness delen.

Med hensyn til buisness laget så kommer der meget mere på det end der er lige nu, ovenstående var kun for at gøre det let at overskue ;o)

Men om ikke andet så har jeg fået testet det, det hele startede med nemmelig at jeg ikke kunne få vist min cache, så tak for hjælpen og smid et svar.

/Websam
Avatar billede arne_v Ekspert
19. november 2005 - 00:22 #22
ah - den form for kryptering

og svar
Avatar billede websam Nybegynder
19. november 2005 - 00:25 #23
Lige en sidste ting er det her måden jeg binder til min dataliste udfra ovenstående :

Dim objList As ArrayList = objBookingBiz.LoadAll
DataList1.DataSource = objList
DataList1.DataBind()

/Websam
Avatar billede arne_v Ekspert
19. november 2005 - 00:26 #24
nu er UI ikke lige mig

men det ser vist meget rigtigt ud
Avatar billede websam Nybegynder
19. november 2005 - 00:27 #25
Ok, takker
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