14 Ekim 2015 Çarşamba
30 Eylül 2015 Çarşamba
entity framework code first - birden fazla foreign key aynı tabloda ise
public class Team
{
public int TeamId { get; set;}
public string Name { get; set; }
public virtual ICollection<Match> HomeMatches { get; set; }
public virtual ICollection<Match> AwayMatches { get; set; }
}
public class Match
{
public int MatchId { get; set; }
public int HomeTeamId { get; set; }
public int GuestTeamId { get; set; }
public float HomePoints { get; set; }
public float GuestPoints { get; set; }
public DateTime Date { get; set; }
public virtual Team HomeTeam { get; set; }
public virtual Team GuestTeam { get; set; }
}
public class Context : DbContext
{
...
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Match>()
.HasRequired(m => m.HomeTeam)
.WithMany(t => t.HomeMatches)
.HasForeignKey(m => m.HomeTeamId)
.WillCascadeOnDelete(false);
modelBuilder.Entity<Match>()
.HasRequired(m => m.GuestTeam)
.WithMany(t => t.AwayMatches)
.HasForeignKey(m => m.GuestTeamId)
.WillCascadeOnDelete(false);
}
}
28 Eylül 2015 Pazartesi
JsonRequestBehavior.AllowGet
JsonRequestBehavior.AllowGet parametresi, parametre gönderimi iznini açar.
Yoksa geriye nesne döndüremezsin
2 Eylül 2015 Çarşamba
.Net Framework’te Timer Class’ları Arasındaki Farklar
.Net Framework’te Timer ismine sahip tam 3 tane class var;
Özellikle Multi-Threaded uygulamalarda tercih edilir. Thread-safe olduğu için, birden çok thread’den erişilebilir.
System.Threading.Timer
TimerCallBack delegate kullanarak, atanmış metodu çalıştırabilir. Metod, framework tarafından oluşturulan başka bir thread’de çalışır.
Timer nesnesi oluşturulduğu anda, çalışmaya başlar ve scope’tan çıkana kadar da çalışır. Durdurmak veya Başlatmak mümkün değildir.
Aşağıdaki örnekte 2.parametre (null), Callback method’a aktarılacak parametreyi gösterir.
3.parametre (1000), Timer nesnesi başlatılmadan önce beklenecek süreyi gösterir.
System.Windows.Forms.Timer
Toolbox’ta gördüğümüz nesnedir. Windows Form ile aynı thread’de ve senkron olarak çalışır, böylece hiçbir UI operasyonunu bölmez.
Daha ayrıntılı bilgi için MSDN’deki şu makaleyi okuyabilirsiniz.
- System.Timers.Timer
- System.Threading.Timer
- System.Windows.Forms.Timer
Özellikle Multi-Threaded uygulamalarda tercih edilir. Thread-safe olduğu için, birden çok thread’den erişilebilir.
| System.Timers.Timer t = new System.Timers.Timer(5000); |
| t.Elapsed += delegate ( object _s, System.Timers.ElapsedEventArgs _e) |
| { |
| MessageBox.Show( "5 saniye geçti!.." ); |
| t.Stop(); |
| }; |
| t.Start(); |
TimerCallBack delegate kullanarak, atanmış metodu çalıştırabilir. Metod, framework tarafından oluşturulan başka bir thread’de çalışır.
Timer nesnesi oluşturulduğu anda, çalışmaya başlar ve scope’tan çıkana kadar da çalışır. Durdurmak veya Başlatmak mümkün değildir.
Aşağıdaki örnekte 2.parametre (null), Callback method’a aktarılacak parametreyi gösterir.
3.parametre (1000), Timer nesnesi başlatılmadan önce beklenecek süreyi gösterir.
| System.Threading.Timer t = new System.Threading.Timer( new System.Threading.TimerCallback(TimerTest), null , 1000, 5000); |
| private void TimerTest( object state) |
| { |
| MessageBox.Show( "5 saniye geçti!.." ); |
| } |
Toolbox’ta gördüğümüz nesnedir. Windows Form ile aynı thread’de ve senkron olarak çalışır, böylece hiçbir UI operasyonunu bölmez.
| System.Windows.Forms.Timer t = new System.Windows.Forms.Timer(); |
| t.Interval = 5000; |
| t.Start(); |
| t.Tick += delegate ( object _s, EventArgs _e) |
| { |
| MessageBox.Show( "5 saniye geçti!.." ); |
t.Stop(); |
| }; |
C# Delegate Kullanımı

Peki delegate nedir ve neden kullanılır?
Delegate en basit anlamıyla metod referansıdır. Yani delegate metod referansını tutar.
Delegate tanımlanırken metodun geri dönüş değeri ve parametreleri belirlenir. Geri dönüş değerini void ve parametresiz tanımlamak da mümkündür. Kullanılacak metod, tanımlanmış olan delegate geri dönüş ve parametrelerine uygun olmalıdır.
Delegenin(delegate) başvurduğu bir metodu dinamik olarak değiştirebiliriz. Dolayısıyla bir delegeyi çağıran kod her çalıştığında farklı bir metod çalıştırabilir.
Delegate kullanılması metodları daha rahat kontrol etmemizi sağlayacak ve uygulamamızın performansını artıracaktır.
Bir örnek yapalım, markette satın alınan ürünler için fiş çıkaracaksınız. Satın alınan ürünün kaç tane olduğunu biliyorsunuz. Bu ürünler için hem KDV dahil hem de KDV hariç fiyatlarını göstereceksiniz. Bunun için iki ayrı metod tanımlayabilir ve bunları delegate yardımıyla kullanabilirsiniz. Örneğimizin kodları ve açıklamaları aşağıdaki gibi.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
| //Hesaplama adında bir delegate tanımı yapıldı. //int tipinde bir parametre bekliyor public delegate decimal Hesaplama( int adet); static void Main( string [] args) { Hesaplama del = Fiyat; Console.WriteLine( "KDV Hariç 5 Ürün" + " Fiyatı: {0}" , del(5)); del = KDVFiyat; //delegate değiştiriliyor Console.WriteLine( "KDV Dahil 5 Ürün" + " Fiyatı: {0}" , del(5)); Console.ReadLine(); } static decimal Fiyat( int sayi) { //Fiyat 10.5 kabul edilerek hesaplandı. (KDV Hariç) return sayi * 10.5m; } static decimal KDVFiyat( int sayi) { decimal kdvharicfiyat = sayi * 10.5m; //KDV %18 düşünüldü return kdvharicfiyat + kdvharicfiyat * 0.18m; } |
Aynı işlemi yapacağımız farklı bir kod yazımı daha yapalım. Burada delegate kullanımının daha etkili bir yöntemini göreceksiniz.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
| public delegate decimal Hesaplama( int adet); static void Main( string [] args) { //istediğimiz sayıda ürün gönderebiliriz //Delegate tip, fonksiyon değişkenmiş gibi gönderilir Console.WriteLine(SonucHesapla(5, Fiyat)); Console.WriteLine(SonucHesapla(5, KDVFiyat)); Console.Read(); } public static decimal SonucHesapla( int sayi, Hesaplama hesapla) { return hesapla(sayi); } static decimal Fiyat( int sayi) { //Fiyat 10.5 kabul edilerek hesaplandı. (KDV Hariç) return sayi * 10.5m; } static decimal KDVFiyat( int sayi) { decimal kdvharicfiyat = sayi * 10.5m; //KDV %18 düşünüldü return kdvharicfiyat + kdvharicfiyat * 0.18m; } |
26 Ağustos 2015 Çarşamba
Abstract Factory Method Tasarım Deseni
Factory Method tasarım deseni, nesne oluşturma ihtiyacı doğrultusunda
ortaya çıkmış bir tasarım desenidir. Bu tasarım deseni, oluşturulacak
somut nesnenin türünü belirlemeye gerek duymadan nesne oluşturma
işlemini temel almaktadır.
Factory deseninin temel amacı nesne oluşturma karmaşıklığını
kullanıcıdan gizlemektir. Ayrıca kullanıcı, oluşturulacak nesnenin somut
türünü belirlemek zorunda değildir. Bunun yerine somut nesnenin
implemente edildiği soyut tür olan interface veya abstract class tipini bilmesi yeterlidir. Yani sorumluluk somut nesnelerden soyut nesnelere aktarılmaktadır. Genel olarak Factory sınıflar “static”
erişim belirleyicili bir metod barındırırlar. Bu metod, kullanıcıya
interface veya abstract class tipinde bir nesne döndürür. Bu sayede
kullanıcılar, alt sınıfların oluşturulması sorumluluğundan dolayı
oluşabilecek hatalardan da uzak tutulmuş olur.
Örnek Uygulama
Bu örnek uygulamamızda Grafik türüne göre Grafiğin temsilini yapan Sembollerin oluşturulmasını Factory Method yöntemiyle üretmeyi amaçlamaktayız.
Yukarıdaki şekildeki tasarım deseninin uygulanışını şu şeklide yapabiliriz.
Gerçek bir uygulamadan alarak göstereceğim bu örnekte bir REST
servisinden gelen Graphic nesnesinin türüne göre sembol nesnesinin
belirlenmesi işlemini Factory Method inceleyeceğiz. Tabi bu örnekteki
konumuz Factory uygulaması olduğundan Servis işlemlerini temsili olarak
göreceğiz. Bizi ilgilendiren sadece nesne üretimi olduğundan nesne
üretim aşamasını inceleyeceğiz.
Bize servis tarafından sunulan Graphic nesnesi Null olarak gelmektedir. Biz yazılım tarafında Graphic nesnesinin türüne göre Sembolünü üretmekle sorumluyuz.
Symbol sınıfının soyut bir tip olduğunu görüyoruz. Graphic sınıfında da bu soyut tip kullanılmıştır.
Somut sembol sınıfları ise SimpleLineSymbol, SimpleFillSymbol, SimpleMarkerSymbol şeklinde oluşturulmuştur.
GraphicSymbolFactory sınıfına eklediğimiz GetSymbol metodu, Graphic türüne göre somut olan Symbol tiplerini oluşturmaktadır. Dikkat edecek olursak kullanıcıya soyut olan bir Symbol tipi vermekteyiz. Yani içerde olup bitenden kullanıcılar haberdar değildir.
GraphicService sınıfı içerisinde tanımlı GetGraphicsFromRESTService metodu, bir servis yardımıyla Graphic nesnesini elde etmektedir. Gelen Graphic nesnesinin sembolü ise kullanıcı tarafından Factory sınıfı yardımıyla belirlenir. Burada kullanıcı diye adlandırdığımız GraphicService sınıfıdır aslında. Çünkü API içerisinde hazırladığımız GraphicSymbolFactory tipini kullanan sınıftır. Kullanıcı sınıf aslında Symbol tipinden türetilen SimpleLineSymbol veya SimpleFillSymbol
gibi tiplerden haberdar değildir. Bu somut tipleri oluşturmak zorunda
da değildir. Bu karmaşık sorumluluğu Factory deseni ile bir sınıfa
aktarmış olduk.
Resim-1
Örnek Uygulama
Bu örnek uygulamamızda Grafik türüne göre Grafiğin temsilini yapan Sembollerin oluşturulmasını Factory Method yöntemiyle üretmeyi amaçlamaktayız.
Yukarıdaki şekildeki tasarım deseninin uygulanışını şu şeklide yapabiliriz.
Resim – 2
public class Graphic { public Symbol Symbol { get ; set ; } } |
public abstract class Symbol { public abstract void draw(); } |
public class SimpleLineSymbol: Symbol { public override void draw() { // Draw line } } public class SimpleFillSymbol: Symbol { public override void draw() { // Draw polygon } } public class SimpleMarkerSymbol: Symbol { public override void draw() { // Draw point } } |
public class GraphicSymbolFactory { public static Symbol GetSymbol(Graphic graphic) { if (graphic is Point) return new SimpleMarkerSymbol(); if (graphic is Polygon) return new SimpleFillSymbol(); if (graphic is Polyline) return new SimpleLineSymbol(); throw new InvalidExpressionException( "Unknown graphic type" ); } } |
public class GraphicService { private readonly IGraphicRestService service; public GraphicService(IGraphicRestService service) { this .service = service; } public Graphic GetGraphicsFromRESTService( string serviceUrl) { Graphic graphic = service.GetGraphic(serviceUrl); graphic.Symbol = GraphicSymbolFactory.GetSymbol(graphic); return graphic; } } |
18 Ağustos 2015 Salı
Jquery like gibi eleman seçme
<div name="falan[0].filan"> filan</div>
<div name="falan[1].falanca"> falanca</div>
<button id="sec">asd</button>
<script>
$('body').on('click', '#sec', function () {
alert($('[name*="falan"][name*="filan"]').attr('name'));
});
</script>
<div name="falan[1].falanca"> falanca</div>
<button id="sec">asd</button>
<script>
$('body').on('click', '#sec', function () {
alert($('[name*="falan"][name*="filan"]').attr('name'));
});
</script>
Kaydol:
Kayıtlar (Atom)
.net 6 mapget kullanımı
app.UseEndpoints(endpoints => { endpoints.MapGet("/", async context => { var response = JsonConvert.Seriali...
-
Komut ekranına aşagıdaki komutları yazarak windows service işlemlerini gerçekleştirebiliriz. Not : Komut ekranı (Başlat -> Çalıştır -...
-
COMMAND PROMPT TEMEL VE İLERİ DÜZEY ANLATIM Command Prompt komutlarını anlatmaya başlamadan önce, MS-DOS komut türlerine değinelim. Komut...
-
(3)BİN (6)MİLYON (9)MİLYAR (12)TRİLYON (15)KATRİLYON (18)KENTİLYON (21)SEKSİLYON (24)SEPTİLYON (27)OKTİLYON (30)NONİLYON (33)DESİL...