12 Eylül 2009 Cumartesi

Scripting Desteği ile Uyarlanabilir Yazılımlar

Bir yazılım firmasının müşterileri için yapabileceği en kayda değer işlerden bir tanesi uygulamalarına scripting desteği eklemesi ve onlara sabit bir uygulamadan öte, uyarlanabilir bir altyapı sunmasıdır. Scripting desteği, müşterinin uygulamanın sınırlarını zorlamasını ve uygulamaya değer katmasını sağlar. Hatta yazılımsal buglarda ufak script kodları tampon görevi görür. Gerçek çözüm ve bu çözümle derlenen yeni versiyon çıkıncaya kadar müşterinin hayatına devam etmesini sağlar.
.NET uygulamalarında scripting desteği sağlayabilmek amacıyla çeşitli yöntemlere başvurmak mümkündür. Kullanılabilecek bu yöntemler aşağıdaki gibidir;
  • “On the fly code compilation” yöntemi(Reflection.Emit); CodeCompiler kullanılarak çalışma-zamanında .NET kodu yaratılır, derlenir ve çalıştırılır. En yaygın yöntem olarak gösterilse de kullanımı, değiştirilmesi ve debug edilmesi en zor olan yöntemdir.
  • “Micsosoft.VisualBasic.Vsa” ad alanı içerisindeki sınıfların ve kütüphanelerin kullanılması; Kolaylığı itibari ile tercih edilebilecek bir yöntemdir. Fakat Vsa ad alanı içerisindeki kütüphanenin kendine ait bir nesne tasarım modeli ve kullanım kuralı olduğu için anlaşılması zor olabilir.
  • “Microsoft ScriptControl” COM sınıfının kullanılması; En basit yöntemdir. Yazımızda bu yöntem üzerinde odaklanacağız. Yapısı basit fakat işlevselliği yüksek olan Microsoft Scripting COM sınıfının kullanımını temel alır. COM teknolojisi ile yazılan bu sınıfın kullanılabilmesi için ilk olarak .NET IDE’si “Add Reference” kısmından “COM” tabına gelinmeli ve bileşen seçilmelidir.
MSScriptControl COM Sınıfının Kullanımı

Uygulamaya COM referansı eklendikten sonra, ilk olarak MSScriptControl.ScriptControlClass sınıfı kullanılarak yeni bir scripting nesnesi yaratılır. Sonrasında script dili seçilir. Tercihe göre vbscript veya javascript dili seçilebilir. Dinamik script bloğu içerisinde eğer bir sınıf kullanılmak isteniyorsa ilgili sınıf yaratılır ve yaratılan nesne değişkeni script kontekstine eklenir. Daha sonra çalıştırılacak sciprt kod bloğu eklenir ve son olarak kod bloğu çalıştırılır.
Dim objScript As New MSScriptControl.ScriptControlClass
objScript.Language = "vbscript"
objScript.AddObject("objCls", objCls)
objScript.AddCode(txtCode.Text)
objScript.Run("DoJob", "Param" )
Örnek Uygulama

Uygulama ASP.NET 2.0 ile geliştirilmiştir. Uygualamada server-side yaratılan 2 tane nesnenin DoJob isimli basit bir vbscipt fonksiyonun kontekstine operation ve msg isimleri ile geçirilip, propertylerinin ve methodlarının kullanım şekli gösterilmiştir. Buradaki uygulamanın ASP.NET tabanlı olması önemli değildir, aynı şekilde windows uygulaması da olabilir.
Public Class OperationReturnMessage
    Public Type As String
    Public Desc
As String
End Class

Public Class Operation
    Public Sub New()
    End Sub

    Public Prop1 As Integer
    Public Prop2 As Integer
    Protected Friend PropRes As Integer

    Public Sub DoOp()
        If Prop1 = 0 Or Prop2 = 0 Then
            Throw New Exception
        Else
            PropRes = Prop1 + Prop2
       
End If
    End Sub
End Class
Tablo1. Operation ve OperationReturnMessage sınıfları
Tablo 1’de uygulamada kullanılan Operation ve OperationReturnMessage sınıfları ve onlara ait sınıf üyeleri gösterilmiştir. Operation sınıfındaki DoOp fonksiyonu, bir nevi toplama işlevi görür. Prop1 ve Prop2’nin değerlerini kontrol ederek, toplar ve bu değeri PropRes’e atar.
Function DoJob(param) 
  if operation.Prop1=0 then
    operation.Prop1 = 1
  end if

  operation.DoOp()
  msg.Type = "S"
  msg.Desc = "Operation Success" 
  DoJob = msg.Type
End Function
Tablo2. vbscript ile yazılan DoJob fonksiyonu
Tablo 2’de DoJob vbscript fonksiyonu gösterilmiştir. operation ve msg nesneleri bu scripte Tablo 3’de görülen kod bloğu ile aktarılmıştır.
    ….
    Dim objMsg As New OperationReturnMessage
    Dim objOp As Operation = OperationOnTheForm()
    Dim result As Object
    objScript.AddObject("operation", objOp)
    objScript.AddObject("msg", objMsg)
    objScript.AddCode(txtCode.Text)
    result = objScript.Run("DoJob", "param")

    ….
Tablo3. operation ve msg nesnelerinin script kontekstine geçirilmesi
Kaynak kod indir
Deniz KILINÇ

Hiç yorum yok:

Yorum Gönder