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;
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.
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 yapylan 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.
Ş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 Ady "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 basyldy"); } }
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ığı.
Ö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 Ady "Mesaj Göster 1", // Menüde görülecek text "OrnekKategori", // Kategori "Mesaj gösterir", // Tanymlayycy bilgi null, // Menüdeki resmi "Mesaj Göster 1"); // Parametre var taskItem2 = new MethodTaskItem( "MesajGoster", // Metod Ady "Mesaj Göster 2", // Menüde görülecek text "OrnekKategori", // Kategori "Mesaj gösterir", // Tanymlayycy 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 basyldy", 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
http://www.enterprisecoding.com http://twitter.com/fatihboy