IIS 7 Yöneticisi Ağaç Hiyerarşisini Genişletme

Bir önceki makalemde sizlerle IIS 7 yöneticisi genişletilebilir mimarisinden ve kendi modülünüzü nasıl ekleyebileceğinizden bahsetmiştim. IIS 7 genişletilebilirlik anlamında bize pek çok yöntem sunmakta ve bu makalemde bu sizlerle IIS7 yöneticisi ağaç hiyerarşisine nasıl yeni bir girdi ekleyebileceğinizi paylaşacağım.

Ağaç hiyerarşisine yeni bir girdi oluşturmak için en basit şekliyle aşağıda sıraladığım 3 temel parçacığa ihtiyaç olacaktır;

  • Hiyerarşi Servisi : Tüm IIS 7 yönetici hiyerarşisini yöneten Hiyerarşi Servisi sunduğu Select, Delete, Refresh v.b. metodlar sayesinde programsal olarak hiyerarşiye müdahale edilmesine olanak sunmaktadır. Arayüz tarafından bizlere bir örneği verilen bu servise ServiceProvider üzerinden ulaşılabilir.
  • Hiyerarşi Bilgisi : Ağaç üzerindeki bir düğümü temsil eden Hiyerarşi Bilgisi, temelde abstract olan Microsoft.Web.Management.Client.HierarchyInfo sınıfınden türetilen bir sınıftır. HierarchyInfo‘dan kalıtılmış metodlar yardımıyla alt düğümlerin bulunup bulunmadığı, düğümün adı gibi bilgileri verebilir ve seçildiğinde,silindiğinde ya da yeniden adlandırıldığında yapılacak olan işlemlerimizi yerine getirebiliriz.
  • Hiyerarşi Sağlayıcısı : IIS 7 Yöneticisi ağaç hiyerarşisini genişletmekte giriş noktanız olan Hiyararşi Sağlayıcısı, temelde abstract Microsoft.Web.Management.Client.HierarchyProvider sınıfından türetilen bir sınıftır. Ağaç hiyerarşisi oluşturulurken hiyerarşi servisi tüm kayıtlı hiyerarşi sağlayıcılarını dolaşarak ağacı oluşturur.

Konuyu pekiştirmek için yazımın devamında yer vereceğim örnek kodlar IIS 7 Yoneticisine Kendi Modulunuzu Eklemek başlıklı yazımında ele aldığım örnek projenin devamı olacaktır. Bu sebeple bir modülü IIS’ yöneticisine nasıl kayıt edeceğiniz ve nasıl debug edebileceğiniz gibi ayrıntıları bildiğinizi yada bir önceki makalemi okuduğunuzu varsayıyorum.

Yukarıdaki teorik bilgi ışığında örnek kodumuzu yazmaya başlayalım. Oluşturacağımız ilk sınıf Hiyerarşi bilgisini verecek olan OrnekHiyerarsiBilgisi sınıf olacaktır.

internal class OrnekHiyerarsiBilgisi : HierarchyInfo {
    public OrnekHiyerarsiBilgisi(IServiceProvider serviceProvider) : base(serviceProvider) { }

    public override string NodeType {
        get { return "Enterprisecoding.IISManagerModule.Ornek"; }
    }

    public override bool SupportsChildren {
        get { return false; }
    }

    public override string Text {
        get { return "Ornek IIS Modülü"; }
    }

    protected override bool OnSelected() {
        return Navigate(typeof(OrnekModulSayfasi));
    }
}

HierarchyInfo  sınıfından türettiğimiz OrnekHiyerarsiBilgisi sınıfında atadan kalıtılan aşağıdaki özellik ve metodlar kullanılarak hiyerarşi servisince kullanılacak bilgiler verilmiştir.

  • SupportsChildren; bool türünden olan bu özellik hiyerarşi servisince düğümümüze bağlı alt düğümler bulunup bulunmadığının sorgulanması için kullanılmaktadır. Bu örnekte varsayılan olan döndüğümüz false değeri bağlı herhangi bir alt düğüm bulunmadığını belirtmektedir.
  • Text; string türünden olan bu özellik hiyerarşi servisinin düğümümüzü arayüzde hangi isimle göstereceğini belirtmek için kullanılır. Örneğimizde düğümümüz arayüzde "Ornek IIS Modülü" ismiyle gösterilecektir.
  • NodeType; string türünden olan bu özellik programsal olarak düğümümüzün hangi türde olduğunu belirtmek ve düğüm türüne göre işlem yapabilmek amacıyla kullanılır. Bu örnek için Enterprisecoding.IISManagerModule.Ornek değerine sahiptir. Bu özelliğe düğüm türünüzü belirten tekil herhangi bir string verilebilir.
  • OnSelected : IIS 7 yönetim konsolu üzerinden kullanıcının düğümümüzü seçmesi durumunda hiyerarşi servisince çağırılacak olan bu metod bize kendi iş mantığımızı çalıştırma imkanı sunmaktadır. Bu örnekte düğümümüz seçildiğinde IIS 7 yönetim konsolunda bir önceki makalemde oluşturduğumuz örnek modül sayfası gösterilecektir.

Bu özellikler ve metodlar dışında SupportsDelete ve SupportsRename özellikleri sayesinde düğümün silme ve yeniden adlandırma fonksiyonaliteleri olup olmadığını belirtebilir ve OnDeleting, OnRenamed, OnRenaming gibi metodlarla da bu fonksiyonaliteleri kontrol edebilirsiniz.

Oluşturacağımız bir diğer sınıf ise OrnekHiyerarsiBilgisi sınıf örneğini hiyerarşi servisine tanıtacağımız hiyerarşi sağlayıcısıdır.

internal class OrnekHiyararsiSaglayicisi : HierarchyProvider {
    public OrnekHiyararsiSaglayicisi(IServiceProvider serviceProvider)
        : base(serviceProvider) {
    }

    public override HierarchyInfo[] GetChildren(HierarchyInfo item) {
        if (item.NodeType == HierarchyInfo.ServerConnection) {
            return new HierarchyInfo[] { new OrnekHiyerarsiBilgisi(this) };
        }

        return null;
    }
}

Yukarıda mümkün olduğunca basit bir şekilde OrnekHiyararsiSaglayicisi sınıfı ile örneklediğim hiyerarşi sağlayıcısı HierarchyProvider sınıfında kalıtarak kullandığı GetChildren metodu ile hiyerarşi servisine gerekli hiyerarşi bilgilerini dönmektedir.

GetChildren metodu parametre olarak kabul ettiği hiyerarşi bilgisi yardımıyla hangi noktada bulunduğunu hiyerarşi servis sınıfından öğrenerek karar vermenizi sağlamaktadır. Yukarıdaki örnekte biraz önce oluşturduğumuz OrnekHiyerarsiBilgisi sınıfının sadece sunucu seviyesinde kullanıması sağlanmakta.

Hiyerarşi bilgisi ve hiyerarşi sağlayıcısı sınıflarını oluşturarak işin önemli bir kısmını tamamlamış oluyoruz. Bu noktada artık modülümüz içerisine giderek hiyerarşi sağlayıcısını tanıtmalıyız. Aşağıda bir önceki makalemde oluşturduğumuz OrnekModul sınıfı içerisinde yer alan initialize metodunu görebilirsiniz.

internal class OrnekModul : Module
{
    protected override void Initialize(IServiceProvider serviceProvider, ModuleInfo moduleInfo)
    {
        base.Initialize(serviceProvider, moduleInfo);

        // ....
        //modül ile ilgili yapılan diğer ilklendirme işlemleri
        // ....

        var extensibilityManager = (IExtensibilityManager)GetService(typeof(IExtensibilityManager));
        extensibilityManager.RegisterExtension(typeof(HierarchyProvider), new OrnekHiyararsiSaglayicisi(serviceProvider));

    }
}

Not; Hiyerarşi sağlayıcısını kayıt ettirdiğimiz bölüme odaklanabilmek için bir önceki makalemde  bahsetmiş olduğum bunun dışındaki bölümlere yer vermiyorum.

Gördüğünüz gibi hiyerarşi sağlayıcısını kayıt etmek bu kadar kolay.

Kodumuzu derledikten sonra IIS yöneticisi konsolunu açtığımızda sol tarafta yer alan ağaç içerisinde oluşturduğumuz düğümü görebilir, bu düğümü seçtiğimizde ise daha önceden oluşturduğumuz modül sayfasının açıldığını test edebiliriz.

IIS Yöneticisi Özelleştirilmiş Ağaç Düğümü

Şimdi de isterseniz bu düğümün menüsüne yeni girdiler eklemeye çalışalım. Hiyerarşi servisi bir düğüme sağ tıklandığında gösterilecek olan menüye ait girdileri ilgili hiyerarşi bilgisi sınıfında yer alan Tasks özelliği sayesinde bulur. TaskListCollection türünden olan bu özellikte eklenecek olan tasklar Microsoft.Web.Management.Client.TaskList sınıfından türetilmiş bir sınıf vasıtasıyla eklenebilir.

internal class OrnekHiyerarsiTaskListesi : TaskList {
    public override System.Collections.ICollection GetTaskItems(){
        var items = new ArrayList();

        var taskItem = new MethodTaskItem(
                            "MesajGoster",      // Metod Adı
                            "Mesaj Göster",     // Menüde görülecek text
                            "OrnekKategori");   // Kategori

        taskItem.Enabled = true;
        items.Add(taskItem);

        return items;
    }

    public void MesajGoster() {
        MessageBox.Show("Mesaj Göster'e butonuna basıldı");
    }
}

Yukarıda yer alan ve TaskList’ten türetilmiş olan OrnekHiyerarsiTaskListesi sınıfında task tanımlaması GetTaskItems metodu içerisinde yapılmaktadır. Bu örnekte MethodTaskItem kullanılarak Mesaj Göster task’ı oluşturulmuştur. MethodTaskItem sınıfı oluşturulurken sırasıyla task’ın çalıştırılacağı metod adı, menüde gösterilecek text ve task’ın ait olduğu kategori adı verilmiştir. Verilen ilk parametre olan metod adı, task menüden seçildiğinde çalıştırılacak olan metodun adıdır. Parametresiz olması gereken bu metod ilgili sınıfta tanımlı olmalıdır. Yukarıdaki örnekte metod adı olarak MesajGoster verildiği ve bu metodun sınıf içerisinde tanımlandığı.

Özelleştirilmiş Ağaç Düğümü Menü

Örnekte, kullanıcı menüden Mesaj göster seçeneğini seçtiğinde MesajGoster metodu çalıştırılarak kullanıcıya "Mesaj Göster’e butonuna basıldı" mesajı gösterilecektir.

Bazı tasarımlarda, eklediğimiz menü nesnesinin kullanacağı metoda parametre geçmek isteyebiliriz. Örneğin; aynı metodu kullanan birden fazla menü nesnesinden hangisinin çağrıyı tetiklediğini bilmek. Bunu yapabilmek için MethodTaskItem sınıfı oluşturulurken kullanıcı verisi geçebileceğimiz constructer’ını kullanmamız yeterli olacaktır.

internal class OrnekHiyerarsiTaskListesi : TaskList {
    public override System.Collections.ICollection GetTaskItems() {
        var items = new ArrayList();

        var taskItem1 = new MethodTaskItem(
                            "MesajGoster",      // Metod Adı
                            "Mesaj Göster 1",   // Menüde görülecek text
                            "OrnekKategori",    // Kategori
                            "Mesaj gösterir",   // Tanımlayıcı bilgi
                            null,               // Menüdeki resmi
                            "Mesaj Göster 1");  // Parametre

        var taskItem2 = new MethodTaskItem(
                            "MesajGoster",      // Metod Adı
                            "Mesaj Göster 2",   // Menüde görülecek text
                            "OrnekKategori",    // Kategori
                            "Mesaj gösterir",   // Tanımlayıcı bilgi
                            null,               // Menüdeki resmi
                            "Mesaj Göster 2");  // Parametre

        taskItem1.Enabled = true;
        taskItem2.Enabled = true;

        items.Add(taskItem1);
        items.Add(taskItem2);

        return items;
    }

    public void MesajGoster(object message) {
        MessageBox.Show(string.Format("{0}'e basıldı", message));
    }
}

MethodTaskItem sınıfının object olarak kullanıcı verisini kabul eden constructer’ı yardımıyla metoda geçmek istediğimiz veriyi belirtebiliriz. Yalnız dikkat edilmesi gereken nokta, bu kullanımda bir öncekinden farklı olarak çağırılacak olan metodun parametresiz değil object kabul eden tek parametreli bir metod olması gerekmektedir. Yukarıdaki örnekte görüldüğü gibi her iki menü nesnesi de aynı metodu kullanmakta, metod kendisine gönderilen parametre doğrultusunda hangi menü nesnesince çağrıldığını bilmekte.

Fatih Boy

Ankara'da yaşayan Fatih, bir kamu kurumunda danışman olarak çalışmaktadır. ALM süreçleri, kurumsal veri yolu sistemleri, kurumsal altyapı ve yazılım geliştirme konularında destek vermektedir. Boş zamanlarında açık kaynak kodlu projeler geliştirmeyi ve bilgisini yazdığı makalelerle paylaşmayı seven Fatih, aynı zamanda Visual C# ve Visual Studio teknolojileri konusundan Microsoft tarafından altı yıl üst üste MVP (En Değerli Profesyonel) ödülüne layık görülmüştür. İş hayatı boyunca masaüstü uygulamaları, web teknolojileri, akıllı istemciler gibi konularda Asp.Net, Php, C#, Java programlama dilleri ve MySql, MsSql ve Oracle gibi veritabanı yönetim yazılımları ile çalışmıştır. İngilizce ve Türkçe olarak yayınlanan makalelerini gerek İngilizce bloğunda, gerekse de Türkçe bloğunda bulabileceğiniz gibi web sitesinden de açık kaynak kodlu geliştirdiği yazılımlarına ulaşabilirsiniz. vCard - Twitter - Facebook - Google+

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir