A CSLA .NET 2.0 style class


Home | Blog | Bio and Contact | CSLA .NET | CSLA Store

06 October 2005

Here’s a “basic” CSLA .NET 2.0 editable root class. It pretty much illustrates all the things you can do in a class under the upcoming version of the framework. In particular note the way validation rules are handled and all the transactional options in the DataPortal_XYZ methods (presumably you’d pick one for your app :) ).

A CustomerTypes class is also included at the bottom, illustrating how to implement a name-value list that works with data binding.

Imports CSLA<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

  <Serializable()> _

Public Class Customer

 

Inherits BusinessBase(Of Customer)

  #

Region ” Business Methods “

   

Private mID As Integer

 

Private mLastName As String = ”“

 

Private mFirstName As String = ”“

 

Private mLastActivity As SmartDate

 

Private mType As Integer

 

Private mCity As String = ”“

   

Private Shared mCustomerTypes As CustomerTypes

   

<?xml:namespace prefix = st1 ns = “urn:schemas-microsoft-com:office:smarttags” />Public Property City() As String

   

Get

     

If CanReadProperty() Then

       

Return mCity

     

Else

       

Throw New System.Security.SecurityException( _

         

“Property read not allowed”)

     

End If

   

End Get

   

Set(ByVal value As String)

     

If CanWriteProperty() Then

       

If Not mCity.Equals(value) Then

          mCity = value           PropertyHasChanged()        

End If

     

Else

       

Throw New System.Security.SecurityException( _

         

“Property write not allowed”)

     

End If

   

End Set

 

End Property

   

Public Shared ReadOnly Property CustomerTypes() As CustomerTypes

   

Get

     

If mCustomerTypes Is Nothing Then

        mCustomerTypes = Library.CustomerTypes.GetCustomerTypes      

End If

     

Return mCustomerTypes

   

End Get

 

End Property

   

Public ReadOnly Property ID() As Integer

   

Get

     

Return mID

   

End Get

 

End Property

   

Public Property LastName() As String

   

Get

     

If CanReadProperty() Then

       

Return mLastName

     

Else

       

Throw New System.Security.SecurityException( _

         

“Property read not allowed”)

     

End If

   

End Get

   

Set(ByVal value As String)

     

If CanWriteProperty() Then

       

If mLastName <> value Then

          mLastName = value.ToUpper           PropertyHasChanged()        

End If

     

Else

       

Throw New System.Security.SecurityException( _

         

“Property write not allowed”)

      

End If

   

End Set

 

End Property

   

Public Property FirstName() As String

   

Get

     

If CanReadProperty() Then

       

Return mFirstName

     

Else

       

Throw New System.Security.SecurityException( _

         

“Property read not allowed”)

     

End If

   

End Get

   

Set(ByVal value As String)

     

If CanWriteProperty() Then

       

If mFirstName <> value Then

          mFirstName = value           PropertyHasChanged()        

End If

     

Else

       

Throw New System.Security.SecurityException( _

         

“Property write not allowed”)

     

End If

   

End Set

 

End Property

   

Public Property LastActivity() As String

   

Get

     

If CanReadProperty() Then

       

Return mLastActivity.Text

     

Else

       

Throw New System.Security.SecurityException( _

         

“Property read not allowed”)

     

End If

   

End Get

   

Set(ByVal value As String)

     

If CanWriteProperty() Then

       

If mLastActivity <> value Then

          mLastActivity.Text = value           PropertyHasChanged()        

End If

     

Else

       

Throw New System.Security.SecurityException( _

         

“Property write not allowed”)

     

End If

   

End Set

 

End Property

   

Public Property CustomerType() As Integer

   

Get

     

If CanReadProperty() Then

       

Return mType

     

Else

       

Throw New System.Security.SecurityException( _

         

“Property read not allowed”)

     

End If

   

End Get

   

Set(ByVal value As Integer)

     

If CanWriteProperty() Then

       

If mType <> value Then

          mType = value           PropertyHasChanged()        

End If

     

Else

       

Throw New System.Security.SecurityException( _

         

“Property write not allowed”)

     

End If

   

End Set

 

End Property

   

Public ReadOnly Property CustomerTypeText() As String

   

Get

     

If CanReadProperty() Then

       

Return CustomerTypes.Value(mType)

     

Else

       

Throw New System.Security.SecurityException( _

         

“Property read not allowed”)

     

End If

   

End Get

 

End Property

  #

End Region

  #

Region ” Business Rules “

   

Protected Overrides Sub AddBusinessRules()

    AddRule(

AddressOf Validation.CommonRules.StringRequired, _

     

“FirstName”)

    AddRule(

AddressOf Validation.CommonRules.StringRequired, _

     

“LastName”)

 

End Sub

  #

End Region

  #

Region ” Object ID Value “

   

Protected Overrides Function GetIdValue() As Object

   

Return mID

 

End Function

  #

End Region

  #

Region ” Constructors “

 

  Private Sub New()

 

    ' don't allow a Guest to see or change city data

    AuthorizationRules.DenyRead("City", "Guest")

    AuthorizationRules.DenyWrite("City", "Guest")

 

  End Sub

  #

End Region

  #

Region ” Factory Methods “

   

Public Shared Function NewCustomer() As Customer

   

Return DataPortal.Create(Of Customer)(Nothing)

 

End Function

   

Public Shared Function GetCustomer(ByVal id As Integer) As Customer

   

Return DataPortal.Fetch(Of Customer)(New Criteria(id))

 

End Function

  Public Shared Sub DeleteCustomer(ByVal id As Integer)

    DataPortal.Delete(New Criteria(id))

  End Sub

 

#

End Region

  #

Region ” Criteria “

    <Serializable()> _  

Private Class Criteria

   

Public ID As Integer

     

Public Sub New(ByVal id As Integer)

     

Me.ID = id

   

End Sub

 

End Class

  #

End Region

  #

Region ” Data Access “

 

  ' Forced to run on client

 

<RunLocal()> _
 

Protected Overrides Sub DataPortal_Create(ByVal criteria As Object)

     

’ get default values from db

   

’ we get here via DataPortal.Create()

      mID =

New System.Random().Next(100, 999)

    mType = CustomerTypes.DefaultKey     CheckRules()    

End Sub

 

  ' Runs on client or server based on DataPortal config

 

Protected Overrides Sub DataPortal_Fetch(ByVal criteria As Object)

     

’ get data from db

   

’ we get here via DataPortal.Fetch()

     

Dim crit As Criteria = DirectCast(criteria, Criteria)

    mID = crit.ID     mType = CustomerTypes.Key(

“Hybrid”)

    mLastName =

“Lhotka”

    mFirstName =

“Rocky”

    CheckRules()    

End Sub

 

  ' COM+ transactions

 

<Transactional()> _
 

Protected Overrides Sub DataPortal_Insert()

     

’ insert data into db

   

’ we get here via obj.Save()

   

End Sub

 

  ' System.Transactions namespace

 

Protected Overrides Sub DataPortal_Update()

     

’ update data in db

   

’ we get here via obj.Save()

     

Using tr As New System.Transactions.TransactionScope

     

’ do updates

      tr.Complete()    

End Using

   

End Sub

 

  ' ADO.NET transactions

 

Protected Overrides Sub DataPortal_DeleteSelf()

     

’ do deferred delete of self

   

’ we get here via obj.Save()

     

Using cn As New SqlClient.SqlConnection

     

Using tr As SqlClient.SqlTransaction = cn.BeginTransaction

       

’ do delete

     

End Using

   

End Using

   

End Sub

 

  ' No transactions

 

Protected Overrides Sub DataPortal_Delete(ByVal criteria As Object)

     

Dim crit As Criteria = DirectCast(criteria, Criteria)

     

’ do immediate delete based on criteria

   

’ we get here via DataPortal.Delete()

   

End Sub

  #

End Region

 

End Class

 

======================================================

Imports CSLA

 

Public Class CustomerTypes

 

Inherits NameValueListBase(Of Integer, String)

   

Public Function DefaultKey() As Integer

   

Return 1

 

End Function

   

Public Function DefaultValue() As String

   

Return Value(DefaultKey)

 

End Function

   

Private Sub New()

   

End Sub

   

Public Shared Function GetCustomerTypes() As CustomerTypes

   

Return DataPortal.Fetch(Of CustomerTypes) _

      (

New Criteria(GetType(CustomerTypes)))

 

End Function

   

Protected Overrides Sub DataPortal_Fetch(ByVal criteria As Object)

   

Me.IsReadOnly = False

    Add(

New NameValuePair(1, “Domestic”))

    Add(

New NameValuePair(2, “International”))

    Add(

New NameValuePair(3, “Hybrid”))

   

Me.IsReadOnly = True

 

End Sub

 

End Class