tisdag 23 augusti 2011

Tester av Class i ASP.NET


Jag vill ha gemensam kod för flera ASP.NET program (eller sidor). Hittills har jag löst det genom att placera gemensam kod i en Masterpage. Det har fungerat ok, men det har blivit oöverskådligt.

Därför har jag undersökt hur man kan använda metoden med App_Code, dvs att gemensam kod placeras i Visual Web Developers mapp App_Code. Sådan kod ska sedan kunna nyttjas av olika program.

Först skapade jag en fil med högerklick på App_Code, och sedan på Add New Item och därefter på template Class. Filen fick namnet ClassA.

I denna fil skapade jag sedan en Class

Public Class ClassA
end Class

I denna Class placerade jag en function som adderar två tal.

Public Shared Function Add(ByVal x As Integer, ByVal y As Integer) As Integer
Add = x + y
End Function

Public betyder att den kan anropas från huvudprogrammet. Egenskapen shared betyder att jag slipper att skapa en objektreferens. Funktionen kan användas på detta enkla sätt med shared:

Dim test As Integer
        test = ClassA.Add(1, 2)

Utan Shared kommer felmeddelande.

I nästa test skapade jag en sub i stället för en funktion. Resultat fick därmed returneras via en parameter som då måste vara ByRef, dvs innehålla en adress till parametern.

Public Shared Sub Add2(ByVal x As Integer, ByRef xx As Integer)
xx = x
End Sub

Subben anropades med
        Dim x As Integer
        ClassA.Add2(5, x)
        testClass += x

En tredje test är mer komplicerat. Nu ville jag läsa cookies och returnera värdet tillbaka till huvudprogrammet.

Public Sub GetAccount()
end sub

Jag skapade sedan två variabler utanför subben för att testa två olika sätt att få resultatet

Private AccountUserName As String
Public AccountPassword As String

Inne i subben placerade jag övriga variabler:

Private AccountUserName As String
Public AccountPassword As String
Public Sub GetAccount()
       Dim AccountId As Integer
end sub

Det riktigt kluriga var att komma fram till hur man läser cookies i en class. I ett vanligt program skriver man helt enkelt

If Not Request.Cookies("BlaBla") Is Nothing Then
AccountId = HttpContext.Current.Request.Cookies("BlaBla") ("id")
                AccountUserName = Request.Cookies("BlaBla")("UserName")
                AccountPassword = Request.Cookies("BlaBla")("Password")
end if

Men det ger felet "'Request' is not declared. It may be inaccessible due to its protection level.". Det visade sig att referensen till Request måste förtydligas och det kunde göras med "HttpContext.Current". Tyvärr är jag oklar över varför det fungerar, men det gör det.

Den färdiga subben har därmed följande utseende:

If Not HttpContext.Current.Request.Cookies("BlaBla") Is Nothing Then
'http://forums.asp.net/t/1699411.aspx/1
                AccountId = HttpContext.Current.Request.Cookies("BlaBla")("id")
                AccountUserName = HttpContext.Current.Request.Cookies("BlaBla")("UserName")
                AccountPassword = HttpContext.Current.Request.Cookies("BlaBla")("Password")
End If

Länken är till denna sida där jag hittade lösningen.

Nu finns det som sagt ytterligare sätt att hämta resultatet från subben:

1) Classen kompletteras med en Property

Public ReadOnly Property Prop_AccountUserName As String
Get
Return AccountUserName
End Get
End Property

Den får huvudprogrammet tag på med koden

ShowMessage.Text = sc.Prop_AccountUserName

2) Huvudprogrammet läser en publik variabel i classe,

ShowMessage.Text += sc.AccountPassword

Nu gäller det att undersöka om App_Code och Classes gör livet lite enklare.

Inga kommentarer:

Skicka en kommentar