.NET Remoting ile Singleton Problemi

Saturday, May 23, 2009 10:41 PM

Bildiginiz gibi .NET 'in dagitik uygulama gelistirme teknigi Remoting kütüphanesine dayaniyor. Remote olan nesneler iki modelde olabilir: Singleton ve SingleCall. Singleton modelinde remote nesneden sadece ve sadece bir adet nesne olusturulur. Yani her çagrimda ulastiginiz nesne host tarafinda aynidir. Boyle olmasina ragmen eger remote nesneye 5 (lease time) dakika içerisinde erismezseniz o nesne host tarafindan bellekten silinir ve çagrim yaparsaniz tekrar yeni bir nesne olusturulur.

Bu durum singleton kavramina aykiri düsmektedir. Bu durumu yaptigim bir uygulamayi test etmek için bir kahve almaya gitmem neticesinde kesfettim. Programi test edip  bir ara verdikten sonra yeniden test edince server tarafindaki nesnenin state(durum) ini kaybettigini gördüm. Bunun bir bug yada bilmedigim bir neden den olabilecegini düsündüm ve arastirmaya basladim. Arastirmalarim bunun bir bug degil "by design" yani bir tasarim seçenegi oldugunu gösterdi. Peki Singleton bir nesnenin sonsuz ömürlü olmasi için ne olmasi gerekiyor! Bu sorunun cevabi ise MarshalByRefObject sinifnin InitializeLifetimeService metodunu override etmek ve geriye null döndürmek. Yani remote nesneleri asagidaki gibi tasarlamak gerekiyor.

public class MyRemoteObject : System.MarshalByRefObject
{
  public override Object InitializeLifetimeService()
  {
    return null;
  }

  .....

}

Etiketler Etiket Yok

CLR Aggregate Function

Saturday, May 23, 2009 10:39 PM

SQL Server 2005 ve VS.NET 2005 kullanarak bir tablodaki e-mailleri birleştirip tek bir string olarak geriye döndüren Aggregate CLR fonksiyonu aşağıdaki gibi yapılabilir.

using System;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;
using System.IO;

[
Serializable]
[Microsoft.SqlServer.Server.
SqlUserDefinedAggregate(Format.UserDefined,MaxByteSize=8000)]
public struct Birlestir :IBinarySerialize
{
public void Init()
{
     toplam =
"";
}
public void Accumulate(SqlString Value)
{
     
if (!Value.IsNull)
          toplam += Value.Value +
";";
}
public void Merge(Birlestir Group)
{
     toplam += Group.toplam;
}
public SqlString Terminate()
{
     
return toplam;
}

private SqlString toplam;

public void Read(BinaryReader r)
{
     toplam =
new SqlString(r.ReadString());
}
public void Write(BinaryWriter w)
{
     w.Write(
this.toplam.Value);
}
}

Etiketler Etiket Yok

AOP (Aspect Oriented Programming)

Sunday, May 03, 2009 1:08 PM

AOP (Aspect Oriented Programming), OOP'un temel almadigi konseptler üzerine kurulmus ve 1990 li yillarin basindan beri gündemde olan ama son yillarda ihtiyaci daha da hissedilen bir gelistirme modeli. Aslinda AOP yeni bir sey degil, günümüzün yazilim gelistirme ihtiyaçlarina daha modüler cevap veren bir yöntem. AOP modeline göre tasarlanmis bir takim kütüphaneler ve altyapilar mevcut. Benim, AOP modelini en iyi kavramanin yolu bu yapilari kullanmaktan geçiyor. Sonrasinda zaten gelistirdiginiz yazilimlarda yavas yavas AOP modelini benimsediginizi göreceksiniz. Hem JAVA hemde .NET dünyasinda kullanabileceginiz popüler AOP araçlarini asagida listeledim.

Microsoft Enterprise Library, www.microsoft.com/patterns/

AspectDNG, http://sourceforge.net/projects/aspectdng/

Loom.NET,  http://www.dcl.hpi.uni-potsdam.de/research/loom/

AspectJ, www.aspectj.org

Spring, www.springframework.org

AspectWerkz, www.aspectwerkz.codehaus.org

Etiketler Etiket Yok

Microsoft durmayı bilmiyor, sevmiyor.!

Sunday, May 03, 2009 1:06 PM

Orcas kod adından yeni kurtulmuş, Visual Studio.NET 2008 dalgasına henüz yeni yakalanmışken yeni bir dalganın daha etkisine kapılmak  üzereyiz. Yeni dalgamız: Oslo. Yani bu seferki kod adımız Oslo.

Analiz, Tasarım, Kodlama ve Test. Bilinen en klasik ve en çok kullanılan proje geliştirme süreci olarak biliyoruz bu aşamaları. Kabaca, uzun br analiz sürecinden sonra iş süreçleri ve gereksinimler çıkarılır, iş süreçleri bir şekilde (uml yada flowchart ile) modellenir ve ardından deneyimli uygulama mimarları tasarım aşamasında işe koyulur. Projenin ana kolonları ve mimarisi belirlendikten sonra kodlama süreci başlarki bu sürece kadar yapılacak işin ana tanımı belli olmuştur, ne yapılacağı tam olarak bellidir. Programcıya çok iş  kalmamıştır. Programcıda görevini yerine getirdikden sonra eğer gerekli ise proje kabul testleri yapılır. Ve projemiz artık çalışan bir  uygulama olarak canlı yayına geçer.

Gayet hoş.! 

Peki Oslo dalgasının vizyonunun bu süreci artık "Analiz(Belki Biraz Tasarım), Test" şeklinde değiştireceğini söylersek inandırıcı olur mu? Evet yanlış duymadınız, Oslo dalgasının tam olarak amacı bu. Yani artık iş analistlerinin oluşturduğu modelleri print edilebilir birer  döküman olmaktan çıkarıp onları direkt olarak çalıştırabilir bir uygulamaya dönüştürmek. Tam olarak Model Güdümlü bir geliştirme  mimarisinden bahsediyoruz. Evet bir çoğumuz MDD yani Model Driven Devlopment terimini duyduk ama Microsoft'un bu konudaki çalışmaları bugüne kadar yetersizdi. Her ne kadar DSL(Domain Specific Language) Toolkit ile bu dalgaya yakalamaya çalışsada yeteri kadar başarılı olduğunu söyleyemeyiz. Oslo dalgası ile bu konuda son sözünü söylemeye kararlı görünüyor. Hedef uygulamaların modellerken aynı zamanda  onların çalıştırılabilir bir uygulama olmasını sağlamak. Yani modeli yazıcıya çıktı olarak değil sunucuya bir uygulama olarak göndereceğiz  artık. Bu amaçla Microsoft  tanım tabanlı bir uygulama geliştirme dili, geliştirme ve modelleme araçları tasarlamayı düşünüyor. Bu vizyon  çerçevesinde Microsoft'un Software+Services konseptinede uygun olması açısından Oslo dalgasını başka ürünlerle de beslemeyi planlıyor.

Micrsosoft'un Oslo kod adlı dalgası, BizTalk Server 6, BizTalk Services 1, System Center 5, Visual Studio 10 ve .NET Framework 4.0  ürünleri ile birlikte hayat bulacağı belirtriliyor. 2009 başlarında bu dalganın ilk gerçek oluşumlarını göreceğimizi düşünüyorum. Bir

ihtimal 2008 sonlarında da ilk kıvılcımları çıkabilir.

Oslo projesi ile ilgili bir takım bağlantılarıda paylaşmak isterim.

http://www.microsoft.com/Presspass/press/2008/jun08/06-03TechEdDevPR.mspx
http://www.microsoft.com/soa/products/oslo.aspx
http://searchsoa.techtarget.com/news/article/0,289142,sid26_gci1280299,00.html

 

Etiketler Etiket Yok

LINQ To XML Altyapısı

Saturday, May 02, 2009 11:14 PM
Kategoriler C#

.NET Framework ile gelen varsayılan LINQ sağlayıcılarından biride LINQ To XML’dir. LINQ To XML, LINQ mimarisinin XML verilerden sorgulama ve güncelleme yapmak için uyarlanmış versiyonudur. Bütün LINQ sağlayıcılarının kendilerine has yapıları olmakla beraber temelde LINQ mimarisi olduğu için benzer kullanımları vardır. Bu bakımdan LINQ To XML ile ilgili bir iki örnek dışında çok fazla detaya girilmeyecektir. Nitekim LINQ To SQL’de geçerli olan bir çok sorgulama metotları burada da geçerlidir.

LINQ To XML ile ilgili sınıfların tamamı System.Xml.Linq isim alanında bulunur. Dolayısıyla bu isim alanının koda eklenmesi gerekir.

İlk örnek olarak LINQ To XML sınıfları yardımıyla projemize bir XML verisi hazırlayalım. Aşağıdaki örnkte System.XML.Linq isim alanında bulunan sınıflar kullanılarak bir XML verisi hazırlanıp dosyaya kaydedilmektedir.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Xml.Linq;

namespace LINQToXML
{
class Program
{
static void Main(string[] args)
{
XElement xml = new XElement("menuler",
new XElement("menu",
new XAttribute("menuNo", "1"),
new XAttribute("fiyat", "15"),
new XElement("anayemek", "Adana Kebabı"),
new XElement("corba", "Ezogelin")
),
new XElement("menu",
new XAttribute("menuNo", "2"),
new XAttribute("fiyat", "34"),
new XElement("anayemek", "Karışık Kebap"),
new XElement("corba", "Domates")
)
);


xml.Save("Yemekler.xml");
}

}
}

Program derlenip çalıştırıldığında aşağıdaki gibi bir XML dosyasının hazırlandığı görülecektir.

<?xml version="1.0" encoding="utf-8"?>
<menuler>
<menu menuNo="1" fiyat="15">
<anayemek>Adana Kebabı</anayemek>
<corba>Ezogelin</corba>
</menu>
<menu menuNo="2" fiyat="34">
<anayemek>Karışık Kebap</anayemek>
<corba>Domates</corba>
</menu>
</menuler>

Görüldüğü gibi System.Xml.Linq isim alanındaki XElement ve XAttribute gibi sınıfları yardımıyla XML veriler çok daha hızlı ve kolay bir şekilde hazırlanabilmektedir.

Veritabanımızda bulunan Urunler tablosunda bulunan bütün ürünleri alarak aşağıdaki gibi XML verisi oluşturmak ise oldukça basit.

<?xml version="1.0" encoding="utf-8"?>
<urunler>
<urun UrunId="1" KategoriId="2">
<UrunAdi>Coca Cola</UrunAdi>
<Fiyat>13</Fiyat>
</urun>
<urun UrunId="4" KategoriId="2">
<UrunAdi>Meyve Suyu</UrunAdi>
<Fiyat>14</Fiyat>
</urun>
<urun UrunId="27" KategoriId="1">
<UrunAdi>VB.NET</UrunAdi>
<Fiyat>35</Fiyat>
</urun>

……
<urunler>

XElement ve LINQ To SQL sorguları iç içe kullanılarak ilişkisel veri çok hızlı bir şekilde XML verisine dönüştürülebilmektedir.

Northwind db = new Northwind();
XElement xmlUrunler = new XElement("urunler",
from u in db.Urunler
orderby u.Fiyat
select new XElement("urun",
new XAttribute("UrunId", u.UrunId),
new XAttribute("KategoriId", u.KategoriId),
new XElement("UrunAdi", u.UrunAdi),
new XElement("Fiyat", u.Fiyat))
);

xmlUrunler.Save("Urunler.xml");


XML veri üzerinden sorgulama yapmakta oldukça basit bir işlemdir. Ancak XML varlıklarına ilişkin sınıflar yaratılmadığı için LINQ sorgularında XElement ve XDocument sınıfının bir takım metotları kullanılmak zorundadır. Örneğin bir xml veri içindeki bütün “Urun” isimli düğümleri elde etmek isterseniz XDocument sınıfınnın Descendants isimli metodunu kullanmalısınız.

Aşağıdaki örnekte daha önce oluşturduğumuz Urunler.xml dosyasından ürün fiyatı 100’den büyük olan ürünlerin bilgisi elde ediliyor.

XDocument doc = XDocument.Load("Urunler.xml");

var sonuclar = from u in doc.Descendants("urun")
where (int)u.Element("Fiyat") > 100
select new Urun {
UrunId = (int)u.Attribute("UrunId"),
UrunAdi=(string)u.Element("UrunAdi")
};

foreach (var urun in sonuclar)
{
Console.WriteLine(urun.UrunAdi);
}

Not : Mevcut bir XML dosyasını belleğe yüklemek için System.Xml.Linq isim alanında bulunan XDocument sınıfı kullanılır.

Yukarıdaki örnekten de görüldüğü üzere düğüm ve nitelik değerlerine Linq To Sql’den farklı olarak XElement sınıfın Attribute ve Element isimli metotları ile erişilmiştir.

Linq To Xml nesneleri kullanılarak veri üzerinde güncelleme yapmakta oldukça kolaydır. Veri güncelleme, silme ve ekleme işlemleri için de yine XElement sınıfının Add, ReplaceAttribute, SetAttributeValue, Remove gibi metotlar kullanılır.

Aşağıdaki örnekte xml dosyasında bulunan ürünlerden ürun kategori numarası 2 olan ürünlerin tamamının fiyatı 10 YTL artırılıp kaydediliyor.

XDocument doc = XDocument.Load("Urunler.xml");

var guncelle = from u in doc.Descendants("urun")
where (int)u.Attribute("KategoriId") == 2
select u;

foreach (var urun in guncelle)
{
int fiyat = (int)urun.Element("Fiyat");
urun.SetElementValue("Fiyat", fiyat + 10);
}

doc.Save("Urunler.xml");

XElement sınfının daha bir çok metodu vardur. İhtiyacınıza göre bu metotları veri güncelleme, silme ve ekleme amaçlı kullanabilirsiniz.

Etiketler Etiket Yok

Tembelliğin Sonu!

Friday, May 01, 2009 5:00 PM

Tembellik, tembellik, tembellik.. Bir yazılımcının en büyük düşmanı tembellik.. Koskoca bir gazetenin internet sitesinde de bu olursa vay halimize.. Efendim, bir internet sitesi bu günlerde ASP.NET'e geçişini yapıyor gördüğüm kadarıyla. İyi güzel de olması gereken ilk şeyi nasıl atlarlar anlamıyorum.

ASP.NET ile uygulama geliştirirken, daha doğrusu web uygulaması geliştirken dikkat edilmesi gereken en önemli şeylerin başında hata yönetimi geliyor.Projelerimde hata yönetiminin üzerinde olabildiğince durmaya çalışırım. Üstelik ASP.NET platformunda hata yönetimi oldukça kolay ve zahmetsiz bir iş. Programcılar malesef kod yazmaya dalıp yapılması gereken en önemli işlemlerden olan hata yönetimi ve güvenlik gibi konuları sonraya bırakıyorlar. Tabi bunda uygulamanın bir an önce canlıya geçmesi için yönetim tarafından yapılan baskılarında payı var. Yazılım süreçleri tam oturmayıp, üstüne birde proje yönetim zaafiyetleri eklenince bu şekilde acimice hataların yapılması da kaçınılmaz oluyor.

 

Not 1: web.config dosyasında <customErrors mode="On"> ayarı yapılarak en azından yukarıdaki hatanın kullanıcılara gösterilmesi engellenebilir. İdeal bir çözüm değil ama en azından hiç birşey yapamıyorsanız bunu yapmak gerekirdi. En fazla beş saniyeye mal olacak bir düzeltmenin yapılmaması eğer bilgi eksikliğinden kaynaklanıyorsa o zaman diyecek bişeyim yok.

Not 2 : Bu yazıyı yazmamdaki amaç kesinlikle siteyi kötülemek yada onların hatalarını göstermek olmadığı için sitenin ismini vermiyorum. Amacım kodlama yaparken tembelliğin ve üşengeçliğin bize nelere mal olacağını göstermektir.

Etiketler Etiket Yok