PBMining

Searching...
Thursday, April 19, 2012

Maintain unit of work using transactionscope in repository pattern

3:52 AM

In this post i am going to show you how to setup Unit of work using transactionscope in easy way.

let's start with creating simple repositories.

   Public Interface ITagRepository
        Inherits IDisposable 'for dispose database context

        Sub Add_Update_Tag(ByVal tgList As List(Of Tag))
        Sub DeleteTag(ByVal tg As Tag)

    End Interface

     Public Interface IUserRepository
        Inherits IDisposable
    
        Function Add_Update_User(ByVal u As OpenIDUser) As OpenIDUser
        Sub RemoveUser(ByVal u As OpenIDUser)
       
    End Interface

   ' -------------------------------------------------------------------------

      Public Class UserRepository
        Implements IUserRepository



        Private con As Connection
        Private context As MyDBEntities

        Sub New()
            con = New Connection
            context = con.GetContext
        End Sub
        Public Function Add_Update_User(ByVal u As OpenIDUser) As OpenIDUser Implements IUserRepository.Add_Update_User

            If u.UserID > 0 Then

                context.OpenIDUsers.Attach(New OpenIDUser With {.UserID = u.UserID})

                context.OpenIDUsers.ApplyCurrentValues(u)

            Else
                context.OpenIDUsers.AddObject(u)

            End If

            context.SaveChanges()

            Return u

        End Function



        Public Sub RemoveUser(ByVal u As OpenIDUser) Implements IUserRepository.RemoveUser

            context.OpenIDUsers.Attach(u)
            context.OpenIDUsers.DeleteObject(u)
            context.SaveChanges()



        End Sub


#Region "IDisposable Support"
        Private disposedValue As Boolean ' To detect redundant calls

        ' IDisposable
        Protected Overridable Sub Dispose(ByVal disposing As Boolean)
            If Not Me.disposedValue Then
                If disposing Then
                    ' TODO: dispose managed state (managed objects).
                End If

                context.Dispose()
    
                ' TODO: free unmanaged resources (unmanaged objects) and override Finalize() below.
                ' TODO: set large fields to null.
            End If
            Me.disposedValue = True
        End Sub

        ' TODO: override Finalize() only if Dispose(ByVal disposing As Boolean) above has code to free unmanaged resources.
        'Protected Overrides Sub Finalize()
        '    ' Do not change this code.  Put cleanup code in Dispose(ByVal disposing As Boolean) above.
        '    Dispose(False)
        '    MyBase.Finalize()
        'End Sub

        ' This code added by Visual Basic to correctly implement the disposable pattern.
        Public Sub Dispose() Implements IDisposable.Dispose
            ' Do not change this code.  Put cleanup code in Dispose(ByVal disposing As Boolean) above.
            Dispose(True)
            GC.SuppressFinalize(Me)
        End Sub
#End Region

    End Class

     Public Class TagRepository
        Implements ITagRepository



        Private con As Connection
        Private context As MyDBEntities

        Sub New()
            con = New Connection
            context = con.GetContext
        End Sub

        Public Sub Add_Update_Tag(ByVal tgList As List(Of Tag)) Implements ITagRepository.Add_Update_Tag

            For Each tg In tgList
                If tg.TagID > 0 Then
                    context.Tags.Attach(New Tag With {.TagID = tg.TagID})
                    context.Tags.ApplyCurrentValues(tg)

                Else
                    context.Tags.AddObject(tg)
                End If
            Next
            context.SaveChanges()

        End Sub

        Public Sub DeleteTag(ByVal tg As Tag) Implements ITagRepository.DeleteTag

            context.Tags.Attach(tg)
            context.Tags.DeleteObject(tg)
            context.SaveChanges()

        End Sub

       
#Region "IDisposable Support"
        Private disposedValue As Boolean ' To detect redundant calls

        ' IDisposable
        Protected Overridable Sub Dispose(ByVal disposing As Boolean)
            If Not Me.disposedValue Then
                If disposing Then
                    ' TODO: dispose managed state (managed objects).
                End If

                context.Dispose()
    
                ' TODO: free unmanaged resources (unmanaged objects) and override Finalize() below.
                ' TODO: set large fields to null.
            End If
            Me.disposedValue = True
        End Sub

        ' TODO: override Finalize() only if Dispose(ByVal disposing As Boolean) above has code to free unmanaged resources.
        'Protected Overrides Sub Finalize()
        '    ' Do not change this code.  Put cleanup code in Dispose(ByVal disposing As Boolean) above.
        '    Dispose(False)
        '    MyBase.Finalize()
        'End Sub

        ' This code added by Visual Basic to correctly implement the disposable pattern.
        Public Sub Dispose() Implements IDisposable.Dispose
            ' Do not change this code.  Put cleanup code in Dispose(ByVal disposing As Boolean) above.
            Dispose(True)
            GC.SuppressFinalize(Me)
        End Sub
#End Region

    End Class


    Function TestMethod(ByVal returnUrl As String) As ActionResult


            Using _ur As IUserRepository = _of.GetInstance(Of IUserRepository)(),
                  _ts = New TransactionScope, _tr = _of.GetInstance(Of ITagRepository)()

                'write your logic here....

    _tr.Complete()
            End Using

        End Function    

Above i create simple controller action that uses all above repository to for done there work it wrap with using code block because it dispose the repository at end and repository is implements from Idisposable so its called its dispose method that we use for dispose our database ObjectContext and also we use transactionScope class that will commit all the transaction done by repository when we call Complete() method of transactionscope ,if any exception generate in between that all transaction would be canceled.

This is the easy way for me,also there are lots of other resources in web to maintain Unit of work. Enjoy.....