in Eski Blog Yazılarım

FluentMigrator İçin Assembly Üretmek

MaestroPanel‘in veritabanı bağımsızlığını sağlamak, veri katmanındaki işleri daha etkili yönetebilmek için yoğun olarak Nhibernate kullanıyoruz. ORM araçları kullanmanın genelinde çok avantaj olmasına rağmen farklı uygulamaların veritabanına erişmesini sağlamak, kullanıcının ihtiyacı olan veritabanı ile ilişkili araçları sağlamak, yeni sürüm için veritabanını yükseltmek, değiştirmek gibi bir takım temel sorunlarla karşı karşıya kalabilirsiniz.

Bu gibi sorunları çözmek için açık kaynak olan FluentMigrator‘u kullanıyoruz. Nuget üzerinden veya github.com üzerinden direkt erişebilirsiniz. FluentMigrator’un ne olduğunu anlatıp satır israfı yapmak istemiyorum kısaca işe yarar bir araç diyebiliriz.
Biz yeni çıkan versionlardaki veritabanı değişikliklerini bu araç ile yapıyoruz fakat kullanırken daha önceden veritabanında yapılacak güncellemeleri ORM mantığına uygun olarak .Net Class’ını Migrator tipinden türetip içine deklare ediyoruz. Veritabanın yeni şemasını yeni sürüme uydurmak için çok kullanışlı fakat mevcut verilerinizde bir değişiklik yapacaksanız orda bir engel karşınıza çıkıyor.

Örneğin uygulamanın admin parolasını unuttunuz. Normalde veritabanına girip (mssql, mysql, sqlite herneyse) şak diye değiştirirsiniz fakat iddalı bir ürün geliştiriyorsanız bunu son kullanıcıya yaptıramasınız. Madem direkt kullanıcıya takla attırmak caiz değil, o zaman kendimiz atsak ve sadece kendi kasemizi kırsak kimseye zararımız olmaz.

Şöyle ki;

FleuntMigrator’a sadece kendi Migration classımız içinde deklare ettiğimiz SQL atraksiyonları yaptırabiliyoruz burda bir sorun yok, fakat parola sıfırlama olayındaki parolanın güvenlik açısından sürekli değişmesi gerekiyor. Peki madem sadece Migrator tipinden türettiğimiz ve assembly haline getirdiğimiz nesneleri çalıştırabiliyoruz, içinde kullanıcıdan gelen veriye göre değişiklik gösteren bir değeri FluentmMigrator’a nasıl işlettirebiliriz? Telaş yok! "Erkan, Enaktarlar goltuğun altında galık!".

Aslında çok amele bir yöntem ama aklıma başka bir şey gelmedi. Ben şöyle yaptım sizde yapabilirsiniz.

.Net Framework bize runtime’da dinamik olarak yeni bir assembly yaratmamızı sağlayan System.CodeDom.Compiler sınıf kütüphanesini sağlıyor (Eyvallah). Bizde her parola istendiğinde FluentMigrator için yeni bir assembly oluşturuyoruz ve Up() fonksiyonunun işletilmesini sağlıyoruz.

Peki .Net ile Assembly’i nasıl oluşturuyoruz. Aşağıda.

Gerçekten kolay benim daha önce hiç ihtiyacım olmadığından daha kallavi bir şey sanıyordum. Özellikle CSharpCodeProvider‘ı kullanınca daha basit oluyor. Bir kaç parametre var. Mesela FluentMigrator’a assembly hazırlarken .Net 3.5 ile derlenmesi gerekiyor bunu parametre olarak kolay bir şekilde geçebiliyorsunuz. CompilerParameters’de ise class’ın ihtiyacı olan diğer referans assembly’leri tanıtmanız için kullanılıyor. Sınıfta veya herhangi bir fonksiyonda sorun yoksa derlenmiş bir şekilde OutputAssembly’e tanımladığınız dizine çıktı veriliyor. Bir şey tanımlamazsanız direkt çalıştığı dizine çıkartıyor.

Unutmadan AssemblyString methoduda aşağıdaki gibi.

Olay bu kadar. Acaba yaklaşım olarak çok mu amele oldu?

Leave a Reply for Hayalcin Cancel Reply

Yorum Bırak

Comment