Inloggen
 
 
 
 
    
Stubs (.NET 2.0)
Location: BlogsFerry Onderwater - Developer    
Posted by: Ferry Onderwater 2-5-2006 22:00
Neem de volgende situatie: We hebben een user control (ascx). Deze usercontrol heeft een public property en een public method. Hoe kunnen we deze code vanuit bijvoorbeeld een andere class aanroepen? Code die publiek aangeroepen wordt binnen een applicatie moet in de App_Code directory staan. Een usercontrol mag daar weer niet staan.
Om dit op te lossen gaan we een stub inzetten. Een stub is feitelijk een class-definitie welke het kenmerk 'MustInherit' heeft en waarvan de public properties en methods als kernmerk 'MustOverride' hebben.
Deze stub zetten we in de App_Code directory en onze ascx laten we de stub 'inheriten'. Hierdoor fungeert de stub als een soort doorgeefluik en kunnen we de code vanuit onze applicatie aanroepen.

Voorbeeld:

Oude ASCX:
Code:
Partial Class dgEditor
    Inherits System.Web.UI.UserControl

    Private _DataGridId As String

    Public Property DataGridId() As String
        Get
            Return _DataGridId
        End Get
        Set(ByVal value As String)
            _DataGridId = value
        End Set
    End Property

    Public Sub LoadData()
        'Aanroepen code
    End Sub
End Class


We laten de daadwerkelijke ascx-code even buiten beschouwing, die is nauwelijks relevant, alleen een beetje HTML. De hierboven getoonde code-behind is hetgeen van belang is.
De enige regel in de ascx zelf die wel belangrijk is is de eerste:
Code:
<%@ Control Language="VB" AutoEventWireup="false" CodeFile="dgEditor.ascx.vb" Inherits="dgEditor" ClassName="dgEditor" %><%@ Control Language="VB" AutoEventWireup="false" CodeFile="dgEditor.ascx.vb" Inherits="dgEditor" ClassName="dgEditor" %>

Je ziet dat bij 'Inherits' de dgEditor class staat zoals deze ook in de code-behind wordt gedefinieerd.

Nu gaan we deze code in tweeen splitsen, de stub-code (in App_Code) en de daadwerkelijke code (het huidige bestand zeg maar).

De stub-code:
Code:
Public MustInherit Class dgEditor
    Inherits System.Web.UI.UserControl

    Public MustOverride Property DataGridId() As String

    Public MustOverride Sub LoadData()

End Class


Je ziet hier dus de class-name terugkomen met 'MustInherit', gevolgd door de inheritance van System.Web.UI.UserControl, net zoals we in de oude code zagen.
Vervolgens worden alle publieke elementen gedefinieerd met 'MustOverride'.

Nu de ascx-code-behind:

Code:
Partial Class _dgEditor
    Inherits dgEditor

    Private _DataGridId As String

    Public Property DataGridId() As String
        Get
            Return _DataGridId
        End Get
        Set(ByVal value As String)
            _DataGridId = value
        End Set
    End Property

    Public Sub LoadData()
        'Aanroepen code
    End Sub
End Class

Grootste verschil met de oude code is de inheritance. In plaats van System.Web.Ui.UserControl erven we nu van dgEditor, onze stubclass.

In de ascx zelf veranderd de bovenste regel:
Code:
<%@ Control Language="VB" AutoEventWireup="false" CodeFile="dgEditor.ascx.vb" Inherits="_dgEditor" ClassName="dgEditor" %><%@ Control Language="VB" AutoEventWireup="false" CodeFile="dgEditor.ascx.vb" Inherits="_dgEditor" ClassName="dgEditor" %>

We erven nu de class _dgEditor (inderdaad, die uit de code-behind en dus niet vanuit de stub!)

Nu kunnen we de code aanroepen zoals we wilden.
Copyright ©2006 Ferry Onderwater
Permalink |  Trackback
  
 
Weblogs
    
Archief
    
Zoeken
    
 
 
 
 
Copyright 2006-2009 by Arcencus
Privacy Statement | Terms Of Use