splash
SOLDAKİ ?
Önceleri atari oyunlarına hevesli olan bu arkadaşınız, teknik lise bilgisayar bölümüne yazıldıktan sonra dikkatini bilgisayar ve yazılım...(Devamı...)
Yazar: Serdar BÖLÜM Tarih: Mart 7th, 2010

Sql Server’da durum nasıl bilmiyorum ama geçenlerde Oracle’da şöyle bir durum farkettim: Where kısmında kullandığımız NOT IN komutu, IN komutunun birebir tersi şeklinde bir sonuç getirmeyebiliyor. Şart kısmında belirttiğimiz değerler içinde NULL olan kayıt varsa işler oldukça değişebiliyor. Küçük bir örnekle açıklamak gerekirse:

 

Linq To Sql Ve N Katmanlı Mimarimiz

Yazar: Serdar BÖLÜM Tarih: Aralık 19th, 2008

architectureAslında okumakta olduğunuz yazının başlığını önce “Linq to Sql Dünyasına Merhaba” diye yazmıştım. Fakat .Net ile uğraşıp da bu konuda yazı yazmayan kalmadı nerdeyse. Bu durumda benim de aynı şeyleri yazmam pek birşey ifade etmeyecekti. Başka bir konuya değinmek gerekiyordu o zaman.  Siz okurlara verilen söz gereği dersimiz Linq olmalı fakat konu değişmeliydi.(Önceki yazımda anlatacağımın sözünü verdiğim diğer konular: Asp.Net Mvc, jquery ve Datagrid). Bu düşüncelerden sonra daha önce merak ettiğim için biraz baktığım, hatta bir projemde kullanmaya çalıştığım, türkçe sitelerde pek değinilmemiş olan bu konu hakkında birşeylerden bahsetmeyi uygun gördüm. Haydi Bismillah :)

Bu arada konumuza geçmeden önce n katmanlı mimari konusuna yabancı olanları öncelikle buradaki yazımı okumasını tavsiye ederim.

Linq to sql çıkmadan önce klasik olarak projelerimde, diğer yazılımcıların ekserisi gibi ben de 3 katmanlı mimariyi uygulamaya çalışırdım ve bu konuda iyi – kötü bir standardı tutturmuş gidiyordum. Ta ki Linq to sql çıktı ve ben bu yeni teknolojiyi öğrenmeye karar verdim, işte o zaman “Benim 3 katmanlı mimarim nasıl olması gerekiyor şimdi?” sorusunu sormaya mecbur kaldım. Biliyorsunuz Linq to sql sayesinde veritabanı ile ilgili temel işler tek komutla halledilecek hale geldi ve en önemlisi veritabanından veri çekmek için yazdığımız sql sorgularını kod tarafında yazmaya başladık. (Cümle “biliyorsunuz” kelimesi ile başladı; eğer bilmiyorsanız buradaki yazı tam size göre).  Buna mukabil katmanlarımızda değişiklik olması su götürmez bir gerçek.

Bu gerçeğin farkına varınca tabi hemen araştırmaya başladım. Türkçe sitelerde bu konuya pek değinilmemiş ama ingilizce sitelerin bu konuda maşallahı var. Ben buradaki yazıyı güzelce okuyup, fazla zamanım olmadığı için direk olarak üzerinde çalıştığım bir projede kullandım. Projede ilerledikçe bazı eksikliklerini seziyorum ama yine de şimdilik iyi gibi. Hemen size her katmandan bir örnek verip konuya son vermek istiyorum.

Örneğimiz soru yazıp kaydedeceğimiz bir uygulama üzerine ve data katmanımız kaydedilen soruları içinde barındıran Question isimli tabloyu temsil ediyor.

Data Katmanı:

Public Class cls_LU_QUESTION
    Private objUIData As New UIData
    Public Function GetAll() As IQueryable(Of LU_QUESTION)
      Try
        Return objUIData.LU_QUESTIONs
      Catch ex As Exception
        Throw ex
      End Try
    End Function
    Public Function GetByIdQuestion(ByVal pIdQuestion As Long) As LU_QUESTION
      Try
        Return (From question In objUIData.LU_QUESTIONs _
                Where question.ID_QUESTION = pIdQuestion _
                Select question)
      Catch ex As Exception
        Throw ex
      End Try
    End Function
    Public Function Add(ByVal objQuestion As LU_QUESTION) As Long
      Try
        objUIData.LU_QUESTIONs.InsertOnSubmit(objQuestion)
        objUIData.SubmitChanges()
        Return objQuestion.ID_QUESTION
      Catch ex As Exception
        Throw ex
      End Try
    End Function
    Public Function Update(ByVal objQuestion As LU_QUESTION) As Boolean
      Try
        Dim tmpQuestion = objUIData.LU_QUESTIONs.SingleOrDefault(Function(x) x.ID_QUESTION = objQuestion.ID_QUESTION)
        objUIData.SubmitChanges()
        Return True
      Catch ex As Exception
        Throw ex
      End Try
    End Function
    Public Function Delete(ByVal pIdQuestion As Long) As Boolean
      Try
        objUIData.LU_QUESTIONs.DeleteOnSubmit((From Question In objUIData.LU_QUESTIONs _
                                           Where Question.ID_QUESTION = pIdQuestion).Single)
        objUIData.SubmitChanges()
        Return True
      Catch ex As Exception
        Throw ex
      End Try
    End Function
  End Class

İş Katmanı:

Public Class cls_LU_QUESTION
        Private objLU_QUESTION As New DAL.cls_LU_QUESTION
        Public Function GetAll() As IQueryable(Of LU_QUESTION)
            Try
                Return objLU_QUESTION.GetAll
            Catch ex As Exception
                Throw ex
            End Try
        End Function
        Public Function Add(ByVal objUser As LU_QUESTION) As Long
            Try
                Return objLU_QUESTION.Add(objUser)
            Catch ex As Exception
                Throw ex
            End Try
        End Function
        Public Function Update(ByVal objUser As LU_QUESTION) As Boolean
            Try
                Return objLU_QUESTION.Update(objUser)
            Catch ex As Exception
                Throw ex
            End Try
        End Function
        Public Function SaveQuestion(ByVal pQuestion As LU_QUESTION, ByVal pLstTags As String()) As Long
            Using pScope As New TransactionScope(TransactionScopeOption.Required, System.TimeSpan.MaxValue)
                'Dim lngIdQuestion As Long = IIf(pQuestion.ID_QUESTION > 0, dalQuestion.Update(pQuestion), dalQuestion.Add(pQuestion))
                Try
                    Dim dalQuestion As New DAL.cls_LU_QUESTION
                    Dim lngIdQuestion As Long = dalQuestion.Add(pQuestion)
                    For Each lstTag In pLstTags
                        Dim dalTagQuestion As New DAL.cls_CR_TAG_QUESTION
                        Dim objTag As New LU_TAG
                        Dim objTagQuestion As New CR_TAG_QUESTION
                        Dim tmpTags As New UIData
                        Dim strTag = lstTag
                        Dim tmpTag = tmpTags.LU_TAGs.SingleOrDefault(Function(x) x.DS_TAG = strTag)
                        If tmpTag Is Nothing Then
                            objTag.DS_TAG = strTag
                            objTag.VALID = 1
                            objTagQuestion.LU_TAG = objTag
                        Else
                            objTagQuestion.ID_TAG = tmpTag.ID_TAG
                        End If
                        objTagQuestion.ID_QUESTION = lngIdQuestion
                        dalTagQuestion.Add(objTagQuestion)
                    Next
                    pScope.Complete()
                Catch ex As Exception
                    Throw ex
                End Try
            End Using
        End Function
    End Class

Sunum Katmanı:

Private Sub btnSave_ServerClick(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnSave.ServerClick
    SaveForm()
    End Sub
  Private Sub SaveForm()
    Dim objQuestion As New LU_QUESTION
    Dim balQuestion As New BAL.cls_LU_QUESTION
    Dim lstTag As String() = Me.txtTags.Value.Split()
    Dim tmpTicket = CType(User.Identity, FormsIdentity).Ticket
    With objQuestion
      .DS_SUBJECT = Me.txtTitle.Value
      .DS_QUESTION = Me.txtBody.Value
      .DT_INSERT_TIME = DateTime.Now
      .ID_QUESTION_TYPE = 1
      .ID_USER = tmpTicket.UserData
      .VALID = 1
    End With
    balQuestion.SaveQuestion(objQuestion, lstTag)
  End Sub

Faydası olacağını umduğum bir yazı ile karşınızda oldum. Görüşmek üzere ;)

Etiketler: , , , , ,



Benzer Yazılar
Kategori: ASP.NET

“Linq To Sql Ve N Katmanlı Mimarimiz” için 4 Yorum

FATİH YILMAZ

verdiğin bilgiler için teşekkür ederim serdar (:

Ömer Fatih Yılmaz

Evet biliyordum… Efsanenin geri döneceğini biliyordum….

Erhan Yılmaz

Makaleye tam ısınıyordum, kodlar copy paste yapılıp makale bitirilmiş.
Bir de efsane diye yorum var.
Gerçekten katıla katıla güldüm burada efsaneye

Serdar BÖLÜM

@Erhan Yılmaz;

Makale konusundaki yorumunda haklısın galiba. Makaleye şevkle başlamıştım aslında ama sonuna doğru makalenin de iyice uzamasıyla kısa kesme gereği duydum. Belki bu vesileyle kodlarda anlaşılmayan kısımlar yorum kısmında tartışılır ve belki daha efektif bir ortam oluşmuş olur. Ne dersiniz hoş olmaz mı :-)

Yorum Yap,Fikrini Paylaş