14 Şubat 2008 Perşembe

Application Block Software Factory 3 New Block Design

Bir önce ki makalede kendimize ait yeni bir uygulama bloğu yazmıştık. Bu makale ile yazdığımız mesaj işlem süreci uygulama bloğunu Visual Studio içerisinde yapılandırma dosyalarında Enterprise Library Configuration Tool ‘u kullanmak için gereken tasarım tarafını oluşturacağız. Enterprise Library Configuration Tool yapılandırma dosyasını bir TreeList şeklinde gösteren Visual Stdio içerisine Enterprise Library 3.1 kurulumu ile eklenen bir araçtır. Bu araç tüm uygulama bloklarını ve provider nesnelerini arayüzde gösterdiği için yapılandırma dosyası karmaşasında kurtulup daha kolay işlem yapabilmemizi sağlamaktadır. Uygulama bloğumuzun yapılandırma dosyası tasarım eklentisi TreeNode ve ProviderData sınıflarını birbirine çevirme işleminden başka bir şey değildir. Enterprise Library Configuration Tool ProviderData sınıflarımızı TreeNode olarak ekranda göstermektedir. Dolayısıyla kendi yazdığımız uygulama bloğu için sadece TreeNode ile ProviderData arasında dönüşüm sağlayacak eklenti ile Enterprise Library Configuration Tool destekle hale gelebiliriz. ABSF bu konuda da bize yardımcı olmaktadır. Uygulama bloğumuzun mimari yapısına benzer bir şekilde ProviderData sınıflarımızı temsil edecek Node sınıfları ABSF yardımı ile oluşturalım.

Evet, bizim için temel Node sınıfını oluşturduk. Şimdi ProcessProviderData için Node sınıfını oluşturalım.

ProcessNode sınıfımız Workers elemanına dikkate almamalıdır. WorkerNode elemanını oluşturmaya sıra geldi. WorkerNode elemanı en alt seviyede ki elemanımız olduğu için WorkerNode’u ConfigurationNode elemanından türetiyoruz. Ayrıca WorkerNode ProcessNode altında görünmelidir.

WorkerNode içinde WorkerTypeName alanı bir tip ismini saklamaktaydı. Bu alan için özel bir editör kullanmalıyız. Enterprise Library içinde ihtiyaç duyabileceğiniz birçok editör hazır olarak sağlanmaktadır. WorkerTypeName bir tip ismi sakladığına göre bir TypeSelectorEditor ile değer atanabilmelidir. Temsil ettiği tipte BaseType ile gösterilmektedir.

[cs]

[Editor(typeof(TypeSelectorEditor), typeof(UITypeEditor))]
[BaseType(typeof(IWorker))]
[SRDescription("WorkerTypeNameDescription", typeof(Resources))]
[SRCategory("CategoryGeneral", typeof(Resources))]
public System.String WorkerTypeName {….

Böylelikle ihtiyacımız olan her üç node oluşmuş oldu fakat şu anda tamamen yapılandırma dosyasından bağımsız hareket ediyorlar. (Şu anda her node istediğimiz yerde gözükecektir fakat yapılandırma dosyasında WorkerProviderData ProcessProviderData altında değil bir üst alanda oluşacaktır.) Neler oluştuğuna bir göz atalım.

Enterprise Library Configuration Tool önce AddApplicationBlockSettingsNodeCommand ile acılır menü üzerine yazdığımız uygulama menüsünü eklemektedir. Her bir node üzerinde açılır menüye CommandRegistrar ile oluşturduğumuz node elemanlarını ekleme kodunu oluşturmaktadır. Enterprise Library Configuration Tool yapılandırma dosyasından (diğer bir değişle ProviderData sınıflarından) node elemanlarına dönmek için ApplicationBlockSettingsNodeBuilder sınıfını kullanmaktadır. Node elemanlarında yapılandırma dosyasına dönmek içinse ApplicationBlockSettingBuilder sınıfını kullanmaktadır. Birinden bağımsız hareket eden node ve yapılandırma dosyamızı ApplicationBlockSettingsBuilder ve ApplicationBlockSettingsNodeBuilder sınıflarına yazacağımız kodlar ile bir birleri ile çalışır hale getirmemiz gerekmektedir. Bizim için problem sadece ProcessProviderData sınıfı içinde ki Workers elemanını yapılandırma dosyasında gösterme durumudur.

[cs]

sealed partial class ApplicationBlockSettingsNodeBuilder {        
private void BuildProcesserProviderProviders() {
    foreach (ProcesserProviderData providerData in 
        blockSettings.ProcesserProviderProviders) 
{
        ProcesserNode providerNode =
NodeCreationService.CreateNodeByDataType(
providerData.GetType(), 
new object[] { providerData }) as ProcesserNode;
        if (providerData is ProcessProviderData) {
            // her ProcessProviderData için Workers alanını doldur
            BuildProcessProvider(providerNode as ProcessNode, 
providerData as ProcessProviderData);
        }
        node.AddNode(providerNode);
    }
}

private void BuildProcessProvider(ProcessNode processNode, 
  ProcessProviderData processProviderData) {
    WorkerNode workerNode;
    foreach(WorkerProviderData workerData in processProviderData.Workers) {
        workerNode = 
        NodeCreationService.CreateNodeByDataType(
workerData.GetType(),
                new object[] { workerData }) as WorkerNode;
        processNode.AddNode(workerNode);
    }
}    
}

Böylelikle ProcessProviderData içinde ki Workers elemanlarını node olarak oluşturduk ve TreeList üzerine eklemiş olduk. Node elemanlarını ProviderData’ya ceviren sınıfada kendi eklentilerimizi yazalım.

[cs]

sealed partial class ApplicationBlockSettingsBuilder {
private void BuildProcesserProviderProviders() {
    ProcesserProviderData processerData;
    foreach (ProcesserNode node in hierarchy
 .FindNodesByType(blockSettingsNode, typeof(ProcesserNode))) {
        processerData = node.ProcesserProviderData;
        if (node is ProcessNode) {
            // ProcessProviderData sınıfına ait Workers elemanlarını oluştur
            FillWorkersData(processerData as ProcessProviderData, node as ProcesserNode);
        }
        blockSettings.ProcesserProviderProviders.Add(processerData);
    }
}

private void FillWorkersData(ProcessProviderData processerData, ProcesserNode processerNode) {
    IList workersNode = 
 hierarchy.FindNodesByType(processerNode, typeof(WorkerNode));
    WorkerProviderData workerData;
    WorkerNode workerNode;
    foreach (ConfigurationNode currentNode in workersNode) {
        workerNode = (currentNode as WorkerNode);
        workerData = new WorkerProviderData(workerNode.WorkerProviderData);
        processerData.Workers.Add(workerData);
    }
}        
}

Resource üzerinde ki açıklama ve başlık alanlarını da kendimize göre güncelleyelim. Artık tasarım ve uygulama bloğu dll dosyalarını Enterprise Library Bin dizinine ekleyerek istediğim proje içerisinden MessageProcessApplicationBlock kullanabiliriz.


Böylelikle bir makale serisinin daha sonuna geldik. Bu makale serisi ile önce hazır uygulama blokları için yeni Provider kütüphanelerinin nasıl yazıldığını inceledik. Daha sonra kendi uygulama bloğumuzu oluşturduk. En son olarak oluşturduğumuz uygulama bloğunu daha kolay yapılandırılabilmesi için Enterprise Library Configuration Tool ile uyumlu hale getirdik. Bir sonra ki makale serisi MVC Framework ve Injection Policy Application Block olacak.

Hiç yorum yok: