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.
Resim-1
Resim-1
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.
Resim - 2
Resim – 2
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.
public class Graphic
{
   public Symbol Symbol { get; set; }
}
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.
public abstract class Symbol
{
     public abstract void draw();
}
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.
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
    }
}
Somut sembol sınıfları ise SimpleLineSymbol, SimpleFillSymbol, SimpleMarkerSymbol şeklinde oluşturulmuştur.
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");
    }
 
}
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.
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;
    }
 
}
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.

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>

22 Temmuz 2015 Çarşamba

Reflection – Yansıma

Reflection, çalışma zamanında .NET assemblylerini, tiplerini ve tiplerin üyelerini dinamik olarak kullanma fırsatı veren yapıdır. Reflection namespace’i içerisinde bulunan tipler ile üyelere dinamik olarak erişme şansına sahibiz.  Basit bir console uygulaması üzerinden örnek uygulama yapalım.
Öncelikle bilgi alacağımız tipi elde etmemiz gerekmektedir. Bunu 3 farklı yol ile yapabilmemiz mümkündür. Elde ettiğimiz tipi “Type” tipinden bir değişkende tutarız. Adından da belli olduğu gibi Type, tipin tipini tutan bir tiptir Smile   bool tipine dinamik olarak erişerek içerisindeki üyelerin isimlerini öğrenmeye çalışalım.
using System.Reflection;

namespace ReflectionKavrami
{
    class Program
    {
        static void Main(string[] args)
        {
            Type tip = typeof(Boolean);
            //Type tip = new Boolean().GetType();
            //Type tip = Type.GetType("System.Boolean");

            MemberInfo[] tipUyeleri = tip.GetMembers();

            Console.WriteLine("{0} tipi içerisinde {1} adet üye mevcuttur.", tip.Name, tipUyeleri.Length);

            int i = 1;
            foreach (MemberInfo member in tipUyeleri)
            {
                Console.WriteLine("{0} - Üye adı : {1} , Üye tipi : {2}", i, member.Name, member.MemberType);
                i++;
            }
        }
    }
}
image
Üyeleri elde etmek için kullandığımız GetMembers metodu, System namespace’I altındaki Type sınıfı içerisinde yer alan non-static bir metottur. Geriye dönüş tipi olan MemberInfo ise System.Reflection namespace’i altında yer alan bir tiptir.
Tüm üyeleri elde etmek yerine, ilgili tipe ait metotları, alanları, property’leri, event’leri, yapıcı metotları da elde etme şansına sahibiz. Type sınıfı içerisinde bu işlemleri yapan ilgili metotlar mevcuttur. Geri dönüş tipleri de System.Reflection isim uzayı altında tanımlı tiplerdir.
Projemize System.Windows.Forms kütüphanesini referans edelim ve Button sınıfı hakkındaki bazı bilgileri ekrana yazdıralım.
class Program
    {
        static void Main(string[] args)
        {
            Type tip = new Button().GetType();

            Console.WriteLine("NameSpace : {0}", tip.Namespace);
            Console.WriteLine("FullName : {0}", tip.FullName);
            Console.WriteLine("Assembly : {0}", tip.Assembly.FullName);
            Console.WriteLine("BaseType : {0}", tip.BaseType);
            Console.WriteLine("is Class : {0}\n", tip.IsClass.ToString());

            Console.WriteLine("{0} tipi içerisinde tanımlı;", tip.Name);
            Console.WriteLine("\t{0} adet constructor metot,", tip.GetConstructors().Length);
            Console.WriteLine("\t{0} adet property,", tip.GetProperties().Length);
            Console.WriteLine("\t{0} adet metot,", tip.GetMethods().Length);
            Console.WriteLine("\t{0} adet event vardır", tip.GetEvents().Length);
        }
    }
image
Çalışma anında belirlenen bir tipin nesne örneğini oluşturmak isteyelim. Kullanıcıdan bir tip adı girmesini isteyelim ve bu tipten bir nesne örnekleyelim.
class Program
    {
        static void Main(string[] args)
        {           
            Console.WriteLine("Lütfen bir tip adı giriniz");
            string tipAdi = Console.ReadLine();

            Type tip = Type.GetType(tipAdi);
            object obj = Activator.CreateInstance(tip);

            Console.WriteLine(obj == null ? "Nesne oluşturulamadı." : "Nesne dinamik olarak örneklendi");
        }
    }
image
image
Son örneğimizde de .net framework içerisinde yer alan bir assembly’I elde edelim ve içerisindeki namespace’lere göre gruplama yapalım. Daha sonra da her bir namespace altındaki toplam tip sayısını ve bu tiplerin adlarını ekrana yazdıralım.
class Program
    {
        static void Main(string[] args)
        {
            Assembly assembly =Assembly.LoadFile(@"C:\Windows\Microsoft.NET\Framework\v2.0.50727\System.Data.dll");

            foreach (var group in assembly.GetTypes().GroupBy(t => t.Namespace))
            {
                Console.WriteLine("{0}({1})", group.Key, group.Count().ToString());

                Console.WriteLine("*****************************");

                foreach (Type tip in group)
                {
                    Console.WriteLine(tip.Name);
                }
                Console.WriteLine();
            }
        }
    }
image

backslah çift tırnak

string a = "hello, world";                // hello, world
string b = @"hello, world";               // hello, world
string c = "hello \t world";              // hello world
string d = @"hello \t world";             // hello \t world
string e = "Joe said \"Hello\" to me";    // Joe said "Hello" to me
string f = @"Joe said ""Hello"" to me";   // Joe said "Hello" to me
string g = "\\\\server\\share\\file.txt"; // \\server\share\file.txt
string h = @"\\server\share\file.txt";    // \\server\share\file.txt

26 Haziran 2015 Cuma

İdenty açma kapama

SET IDENTITY_INSERT [dbo].[Post] ON
Kapatıyor

SET IDENTITY_INSERT [dbo].[Post] off 
Açıyor

16 Haziran 2015 Salı

String Format for DateTime [C#]

This example shows how to format DateTime using String.Format method. All formatting can be done also using DateTime.ToString method.

Custom DateTime Formatting

There are following custom format specifiers y (year), M (month), d (day), h (hour 12), H (hour 24), m (minute), s (second), f (second fraction), F (second fraction, trailing zeroes are trimmed), t (P.M or A.M) and z (time zone).
Following examples demonstrate how are the format specifiers rewritten to the output.
[C#]
// create date time 2008-03-09 16:05:07.123
DateTime dt = new DateTime(2008, 3, 9, 16, 5, 7, 123);

String.Format("{0:y yy yyy yyyy}", dt);  // "8 08 008 2008"   year
String.Format("{0:M MM MMM MMMM}", dt);  // "3 03 Mar March"  month
String.Format("{0:d dd ddd dddd}", dt);  // "9 09 Sun Sunday" day
String.Format("{0:h hh H HH}",     dt);  // "4 04 16 16"      hour 12/24
String.Format("{0:m mm}",          dt);  // "5 05"            minute
String.Format("{0:s ss}",          dt);  // "7 07"            second
String.Format("{0:f ff fff ffff}", dt);  // "1 12 123 1230"   sec.fraction
String.Format("{0:F FF FFF FFFF}", dt);  // "1 12 123 123"    without zeroes
String.Format("{0:t tt}",          dt);  // "P PM"            A.M. or P.M.
String.Format("{0:z zz zzz}",      dt);  // "-6 -06 -06:00"   time zone

You can use also date separator / (slash) and time sepatator : (colon). These characters will be rewritten to characters defined in the current DateTimeForma­tInfo.DateSepa­rator and DateTimeForma­tInfo.TimeSepa­rator.
[C#]
// date separator in german culture is "." (so "/" changes to ".")
String.Format("{0:d/M/yyyy HH:mm:ss}", dt); // "9/3/2008 16:05:07" - english (en-US)
String.Format("{0:d/M/yyyy HH:mm:ss}", dt); // "9.3.2008 16:05:07" - german (de-DE)

Here are some examples of custom date and time formatting:
[C#]
// month/day numbers without/with leading zeroes
String.Format("{0:M/d/yyyy}", dt);            // "3/9/2008"
String.Format("{0:MM/dd/yyyy}", dt);          // "03/09/2008"

// day/month names
String.Format("{0:ddd, MMM d, yyyy}", dt);    // "Sun, Mar 9, 2008"
String.Format("{0:dddd, MMMM d, yyyy}", dt);  // "Sunday, March 9, 2008"

// two/four digit year
String.Format("{0:MM/dd/yy}", dt);            // "03/09/08"
String.Format("{0:MM/dd/yyyy}", dt);          // "03/09/2008"

Standard DateTime Formatting

In DateTimeForma­tInfo there are defined standard patterns for the current culture. For example property ShortTimePattern is string that contains value h:mm tt for en-US culture and value HH:mm for de-DE culture.
Following table shows patterns defined in DateTimeForma­tInfo and their values for en-US culture. First column contains format specifiers for the String.Format method.
Specifier DateTimeFormatInfo property Pattern value (for en-US culture)
t ShortTimePattern h:mm tt
d ShortDatePattern M/d/yyyy
T LongTimePattern h:mm:ss tt
D LongDatePattern dddd, MMMM dd, yyyy
f (combination of D and t) dddd, MMMM dd, yyyy h:mm tt
F FullDateTimePattern dddd, MMMM dd, yyyy h:mm:ss tt
g (combination of d and t) M/d/yyyy h:mm tt
G (combination of d and T) M/d/yyyy h:mm:ss tt
m, M MonthDayPattern MMMM dd
y, Y YearMonthPattern MMMM, yyyy
r, R RFC1123Pattern ddd, dd MMM yyyy HH':'mm':'ss 'GMT' (*)
s SortableDateTi­mePattern yyyy'-'MM'-'dd'T'HH':'mm':'ss (*)
u UniversalSorta­bleDateTimePat­tern yyyy'-'MM'-'dd HH':'mm':'ss'Z' (*)
(*) = culture independent
Following examples show usage of standard format specifiers in String.Format method and the resulting output.
[C#]
String.Format("{0:t}", dt);  // "4:05 PM"                         ShortTime
String.Format("{0:d}", dt);  // "3/9/2008"                        ShortDate
String.Format("{0:T}", dt);  // "4:05:07 PM"                      LongTime
String.Format("{0:D}", dt);  // "Sunday, March 09, 2008"          LongDate
String.Format("{0:f}", dt);  // "Sunday, March 09, 2008 4:05 PM"  LongDate+ShortTime
String.Format("{0:F}", dt);  // "Sunday, March 09, 2008 4:05:07 PM" FullDateTime
String.Format("{0:g}", dt);  // "3/9/2008 4:05 PM"                ShortDate+ShortTime
String.Format("{0:G}", dt);  // "3/9/2008 4:05:07 PM"             ShortDate+LongTime
String.Format("{0:m}", dt);  // "March 09"                        MonthDay
String.Format("{0:y}", dt);  // "March, 2008"                     YearMonth
String.Format("{0:r}", dt);  // "Sun, 09 Mar 2008 16:05:07 GMT"   RFC1123
String.Format("{0:s}", dt);  // "2008-03-09T16:05:07"             SortableDateTime
String.Format("{0:u}", dt);  // "2008-03-09 16:05:07Z"            UniversalSortableDateTime

asp.net mvc list post etme

<input type="hidden" name="yourmodelprefix[0].PlanID" />
<input type="hidden" name="yourmodelprefix[0].CurrentPlan" />
<input type="checkbox" name="yourmodelprefix[0].ShouldCompare" />
<input type="hidden" name="yourmodelprefix[1].PlanID" />
<input type="hidden" name="yourmodelprefix[1].CurrentPlan" />
<input type="checkbox" name="yourmodelprefix[1].ShouldCompare" />

.net 6 mapget kullanımı

 app.UseEndpoints(endpoints => {     endpoints.MapGet("/", async context =>     {         var response = JsonConvert.Seriali...