Sayfalar

30 Ağustos 2019 Cuma

NLayered Proje İşlemleri


1- Boş bir Solution Açılır.
2- Add>NewProject>ClassLibrary(.NET Framework) >Projeİsmi.Entities
3- Add>NewProject>ClassLibrary(.NET Framework) >Projeİsmi.DataAccess
4- Add>NewProject>ClassLibrary(.NET Framework) >Projeİsmi.Business
5- Add>NewProject>ClassLibrary(.NET Framework) >Projeİsmi.ADesktopUI


1- Entities, DataAccsess, Business projeleri altına, "Abstract" ve "Concrete" klasörleri oluşturulur.
2- DataAccess Projesine EntityFrameWork NugetPaketi yüklenir.

3- Projeİsmi.WebFormUI>App.Config içerisine connectionString eklenir. Proje Build edilir.



Konun Product ve NorthwindContext üzerinden özeti:

1- EntitiesProjesi> Concrete> Product clasını oluştur. DB ile aynı propları ver.
2- EntitiesProjesi> Abstract> IEntity Interface'i oluştur. Product:IEntity yap.

3- DataAccessProjesi> Concrete>EntityFramework klasörü ekle.( İleride farklı DB eklenmesine yönelik tüm DB operasyonları ayırıyoruz)
4- DataAccessProjesi> Concrete>EntityFramework >NorthwindContext sınıfını oluştur. :DBContexten inherit et.

5- NorthwindContext> DbSet<Product>Produtcs{get;set;} ile entity tanımla
6- DataAccessProjesi>Abstract> IEntityRepository interface ekle.( Db'den bağlandığımız tüm Entitiylerde yapacağımız ortak işlemleri buraya tanımla Add,Update..)
7- DataAccessProjesi> Concrete>EntityFramework> EF Context'i ile Entityleri bağlamak için EFContextRepository<TContext,TEntitiy> olacak şekilde bir base sınıf oluştur.
8-Ardından EFContextRepository<TContext,TEntitiy>  : IEntityRepository<TEntity> şeklinde bu ikisini bağla ve where TEntity: class.. vb. ile Genericlerin durumunu netleştir. İmplemanstasyonu yap operasyonları kodla.
9- DataAccessProjesi> Concrete>EntityFramework >EFProductDal sınıfını oluştur.
10- DataAccessProjesi>Abstract> IProductDal interface oluşutur. :IEntityRepository<Product> olarak inherit et.  
11- EFProductDal : EFContextRepository<NorthwindContext,Product> , IProductDal olarak inherit et.

11- BusinessProjesi>Concrete>ProductManager sınıfı oluştur.
12- BusinessProjesi>Abstract>IProductService interface oluştur. Businenss katmamnında kullanılacak kodları belirt
13- ProductManager:IProductService , kodları impl. et ve içini doldur.
14- ctor ile ProductManager her newlendiğinde yanında birde IProductDal gelmesini sağla. Bu IProductDal kodların içinde kullanarak DB ile bağlantıyı sağlayacaktır.

15- ADesktopUI>NugetPackage>EFW install et aksi halde hata alırsın.
16- ADesktopUI> Listeyi datagridView'e doldurmak için bir tane IProductServis tanımla ve Form1 ctor'unda ProductManager( new EFProductDal()) ile değişkeni ata.
17- Form Load'da productservis.GetProducts() ile Listeyi edin.


1- Business Katmanında ValidationRules klasörü oluşturulur ve  ADesktopUI'dan gelen kullanıcı dataları bu katmanda Fludent Validation ile kontrol edilir.!




















System.InvalidOperationException



System.InvalidOperationException: 'No Entity Framework provider found for the ADO.NET provider with invariant name 'System.Data.SqlClient'. Make sure the provider is registered in the 'entityFramework' section of the application config file.

Solution:
You've added EF to a class library project. You also need to add it to the project that references it (your console app, website or whatever).

29 Ağustos 2019 Perşembe

GitHub


Versiyon Kontrol Sistemi.

Aynı dosya üzerinde yapılan değişikliklerin takip edilebildiği, takım olarak bir proje üzerinde aynı anda çalışabilme imkanı sunan, projelerin bir havuzda tutulduğu bir sistemdir.

Tek kişi yada birden fazla kişi projede çalışşsa bile çakışan noktalar olursa dahi dosyanın iki versiyonu birleştirilir.

Yapılan tüm değişiklikler geçmişe dönük olarak takip edilebilir.

Versiyonlama yaptığı için herhangi bir anda eski bir versiyona dönülebilir.

Eski ve yeni versiyonları arasında fark karşılaştırılması bile yaptırılabilir.


https://github.com/habilgur


Set Combobox Datasource Display Member in EF


Form üzerinde bir combobox'ın açılır listesine DisplayMember özelliği liste atanması...

private void SetCmboxDisplayMembers()
{
    using (NorthwindContext context = new NorthwindContext())
    {
 
        cmbCategories.ValueMember = "CategoryId";
        cmbCategories.DisplayMember = "CategoryName";
        cmbCategories.DataSource = context.Categories.ToList();
    }
}

private void cmbCategories_SelectedIndexChanged(object sender, EventArgs e)
{
    dgvProduct.DataSource = 
        productDal.SearchByCategoryId(Convert.ToInt32(cmbCategories.SelectedValue));
}






Entity Framwork Proje Implemantasyonu


1- Install EntityFramwork Nuget Packed
2- New Class >public  "Nortwind"Context > Inherit from : DBContext
3- In Class > set DbSet<TEntity> TableName(s) {get;set;}
4- Generate  DbSet<TEntity> as a new class (Product etc)
5- Write same properties of Product class from Db Table' fields
6- Write connectionString in App.config file after <conficSections> between <configration>

Not: connectionString UI içeren Projedeki App.Config içerisine kaydeilmeli aksi halde Veri tabanında yeni bir DB oluşturur.


  <connectionStrings>
    <add name="NorthwindContext" 
         connectionString="Data Source=.\sqlexpress;
         Initial Catalog=Northwind; 
         Integrated Security=True; 
         User Id=sa Password=H1978g2808;" 
         providerName="System.Data.SqlClient" />
  </connectionStrings>

Fun


Değer tip dönen metotları çalıştırmak üzere tasarlanmış bir mimaridir. Gönderilen kod bloğunu yada metotu çalıştırır.

class Program
{
 
    static void Main(string[] args)
    {
 
        //Parametre alıp int döenen Fun metot
        Func<intintint> callSum = Sum;     
        Console.WriteLine(callSum(13));
 
 
        // Parametresiz int değer dönen bir Fun metot
        Func<int> getRandomnumber = () => new Random().Next(1100);
 
        Console.WriteLine(getRandomnumber());
 
 
        Console.ReadLine();
 
    }
 
 
    public static int Sum(int num1, int num2)
    {
 
        Console.WriteLine( num1 + num2);
        return num1 + num2;
    }
 
 
}

Action


Void metotları çalıştırmak üzere tasarlanmış bir mimaridir. Gönderilen kod bloğunu yada metotu çalıştırır.

MyAction(() =>
{
    SayHello();  //Sonuç "Hello"
});
 
 
 void MyAction(Action action)
{
    try
    {
        action.Invoke();
    }
    catch (Exception ex)
    {
 
        Console.WriteLine(ex.Message);
    }
}
 
 
 void SayHello()
{
    Console.WriteLine("Hello");
}

Delegates



Void olan ve parametre almayan metotları iletmek için kullanılacak delege tanımlaması:
Bir senaryo çerçevesinde tasvir edelim;
Osmanlı, İngiliz Kralına sadece mesaj iletip mesaj alacak bir elçi yollamak istediğinde

Delegate HQ adlı merkezden
public delegate void DelegateHQ();
Bir elçi tayin edilir.
DelegateHQ ottomanDelegate;
Bu elçiye iki adet görev verilir.(+=)
ottomanDelegate = ottomanSultan.SendMessage;
ottomanDelegate += ottomanSultan.GetFeedBack;
Elçi kralın huzurunda bu görevleri yerine getirir.
ottomanDelegate();
Eğer yolda bir değişiklik olursa ör. Mesajı göndermekten vazgeçilirse bu görev iptal edilir.( - = )
ottomanDelegate -= ottomanSultan.SendMessage;
Void olan ve parametre alan metotları iletmek için kullanılacak delege tanımlaması:
public delegate void DelegateHQ2(string text);
DelegateHQ2 ottomanDelegateWithFerman;
ottomanDelegateWithFerman = ottomanSultan.SendFerman;
ottomanDelegateWithFerman("ferman içeriği"); 
Değer dönen ve parametre alan metotları iletmek için kullanılacak delege tanımlaması:
public delegate int DelegateHQ3(int number1, int number2);
DelegateHQ3 ottomanDelegateWithNum;
ottomanDelegateWithNum = ottomanSultan.ReceiveGold;
ottomanDelegateWithNum(24);

 Tüm kodlama:

namespace Delegates
{
    class Program
    {
        public delegate void DelegateHQ();
 
        public delegate void DelegateHQ2(string text);
 
        public delegate int DelegateHQ3(int number1, int number2);
 
        static void Main(string[] args)
        {
            OttomanSultan ottomanSultan = new OttomanSultan();
 
            DelegateHQ ottomanDelegate;
            ottomanDelegate = ottomanSultan.SendMessage;
            ottomanDelegate += ottomanSultan.GetFeedBack;
            ottomanDelegate -= ottomanSultan.SendMessage;
            ottomanDelegate();
 
            DelegateHQ2 ottomanDelegateWithFerman;
            ottomanDelegateWithFerman = ottomanSultan.SendFerman;
            ottomanDelegateWithFerman("ferman içeriği");
 
            DelegateHQ3 ottomanDelegateWithNum;
            ottomanDelegateWithNum = ottomanSultan.ReceiveGold;
            ottomanDelegateWithNum(24);
 
 
            Console.ReadLine();
        }
 
        public class OttomanSultan
        {
            public void SendMessage()
            {
                Console.WriteLine("Message received by England King!");
            }
 
            public void GetFeedBack()
            {
                Console.WriteLine("Feed Back taken by ottomanDelegate!");
            }
 
            public void SendFerman( string ferman)
            {
                Console.WriteLine("{0} received by England King!",ferman);
            }
 
            public int ReceiveGold(int num1, int num2)
            {
                
                Console.WriteLine("{0} gold taken ", num1+num2);
                return num1 + num2;
            }
 
 
        }
    }
}





Attributes Usage()


Attribute Usage ile tanımlanan Att. nerelerde kullanılabileceğini belirleriz.

Örn: Sadece classlarda kullanılmak üzere tanımlanmış olan MyRequired Attribute, Attribute Usage() > Attribute.Targets.Class verildiği için Customer sınıfındaki propertieslerde kullanıldığında uyarı aldık.

[MyTable("Customer")]
public class Customer : IEntity
{
    public int Id { getset; }
    [MyRequired]
    public string FirstName { getset; }
    [MyRequired]
    public string LastName { getset; }
    public int Age { getset; }
 
}
 
 
[AttributeUsage(AttributeTargets.Class)]
class MyRequiredAttribute:Attribute
{
 
} 


Birden fazla Usage() alanı tanımlayabiliriz

[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field)]
class MyRequiredAttribute:Attribute
{
 
}



Attributes & Custom Attributes



System.CompenentMode.DataAnnotations sınıfına ait bir özelliktir.
Sınıflara, metotlara sınırlama, kural yada ilave özellik katmak için kullanılır.
Örneğin Customer sınıfı instance alınırken FirstName prop. zorunlu olarak yazılmalıdır.
Yada Class'ın başına da attribute yazılabilir.

[Table("Customer")]
public class Customer : IEntity
{
    public int Id { getset; }
    [Required]
    public string FirstName { getset; }
    [Required]
    public string LastName { getset; }
    public int Age { getset; }
 
}

Kendi Attribute sınıflarımızı da oluşturabiliriz. Yukarıdaki örnekte DataAnnotations kullanıldı. Şimdide kendi sınıfımızdan Att. türetelim. Bu sınıfların hepsi "Attribute" sınıfından miras almalıdırlar.



[MyTable("Customer")]
public class Customer : IEntity
{
    public int Id { getset; }
    [MyRequired]
    public string FirstName { getset; }
    [MyRequired]
    public string LastName { getset; }
    public int Age { getset; }
 
}
 
 
class MyRequiredAttribute:Attribute
{
 
}
 
class MyTableAttribute:Attribute
{
    string _tablename;
 
    public MyTableAttribute(string tableName)
    {
        _tablename = tableName;
    }
 
}


-----


28 Ağustos 2019 Çarşamba

Generic Kısıtlama


Generic kısmında tanımlanan varlık için belirli kriterler eklenerek böylece hatalı tiplerin kullanılmasının önüne geçilebilir yada tipler ihtiyaç durumuna göre kısıtlanabilir.

Referans Tip Kısıtlama:

Örneğin aşağıdaki durumda string yada istenmeyen bir tip yollanımının önüne geçmek için referans tip olan( class bu anlama gelir) , new'lenebilen ve bir Entity ( DB nesnesi) olan varlıklar kullanılabilir filtresi ile Generic'i kısıtlamış oluruz.


public interface IRepository<Twhere T : classIEntitynew()
{
    void Add(T entity);
    void Update(T entity);
    void Delete(T entity);
    List<T> GetAll();
    List<T> SearchByName(string key);
    List<T> GetByUnitPriceAToZ();
    List<T> GetByUnitPriceZToA();
}

Değer Tip Kısıtlama:

Yalnızca int string vb değer tipler için aşağıdaki gibi ksııtlama yapılabilir.

public interface IRepository<Twhere T : struct
{
    void Add(T entity);
    void Update(T entity);
    void Delete(T entity);
    List<T> GetAll();
    List<T> SearchByName(string key);
    List<T> GetByUnitPriceAToZ();
    List<T> GetByUnitPriceZToA();
}

Generics Sınıf ve Metotlar


Birden fazla sınıfta kullanılacak aynı metotlar mevcut ise bunu Generic metot ve sınıflar ile halledebiliriz. Örneğin Product ve Customer adlı iki sınıfımız mevcut olsun ve her ikisinde de belli mettotlar kullanılsın. Bu bağlamda bir Genereic interface oluşturup kullanım alanlarına göre tipleri atayabiliriz.

Örn:
Bir IRepository interface'i oluşturuyoruz ve içine ortak kullanılacak metotları koyuyoruz.
<T> (Type) ile ortak bir nesne belirtiyoruz.

public interface IRepository<T> 
{
    void Add(T entity);
    void Update(T entity);
    void Delete(T entity);
    List<T> GetAll();
    List<T> SearchByName(string key);
    List<T> GetByUnitPriceAToZ();
    List<T> GetByUnitPriceZToA();
}

Sonrasında IProductDal IRepository uyguluyoruz ve Tipini sen "Product" olacaksın diye belirtiyoruz.

public interface IProductDal :IRepository<Product>
{
 
}

Artık ProductDal sınıfında ki işlemlerde product nesnesini kullanabiliriz.

public class ProductDal : IProductDal
{
    public void Add(Product product)
    {
        using (ETradeContext context = new ETradeContext())
        {
            context.Products.Add(product);
            context.SaveChanges();
        }
    }
 
    public void Delete(Product product)
    {
        using (ETradeContext context = new ETradeContext())
        {
            var productInDb = context.Entry(product);
            productInDb.State = EntityState.Deleted;
            context.SaveChanges();
        }
    }
----
Daha sonra Customer sınıfına aynı işlemlri yaparak Genericleri kullanmış oluyoruz.

public interface ICustomerDalIRepository<Customer>
{
 
}



public class CustomerDalICustomerDal
{
    public void Add(Customer entity)
    {
        throw new NotImplementedException();
    }
 
    public void Delete(Customer entity)
    {
        throw new NotImplementedException();
    }






---








---

Entity FrameWork Add-Update-Delete


public class ProductDal : IProductDal
 {
     public void Add(Product product)
     {
         using (ETradeContext context = new ETradeContext())
         {
 
             context.Products.Add(product);
 
             context.SaveChanges();
 
         }
     }
 
     public void Delete(Product product)
     {
         using (ETradeContext context = new ETradeContext())
         {
 
             var productInDb = context.Entry(product);
             productInDb.State = EntityState.Deleted;
             context.SaveChanges();
         }
     }
 
     public void Update(Product product)
     {
         using (ETradeContext context = new ETradeContext())
         {
 
             var productInDb = context.Entry(product);
             productInDb.State = EntityState.Modified;
             context.SaveChanges();
 
 
         }
     }

ADO.NET Sql Connection ve Grid View



public List<Product> GetAll()
{
    SqlConnection con = new SqlConnection
    (@"Server=.\sqlexpress; Initial Catalog=ETrade; User Id=sa; Password=***;");
 
    if (con.State==ConnectionState.Closed)
    {
        con.Open();
    }
 
    SqlCommand sqlCommand = new SqlCommand("SELECT * FROM Products", con);        
 
    SqlDataReader sqlDataReader= sqlCommand.ExecuteReader();
 
    List<Product> products = new List<Product>();
 
    while (sqlDataReader.Read())
    {
        Product product = new Product()
        {
            Id = (Int32)sqlDataReader["Id"],
            Name = sqlDataReader["Name"].ToString(),
            UnitPrice = (decimal)sqlDataReader["UnitPrice"],
            StockAmount = (Int32)sqlDataReader["StockAmount"],
 
 
        };
 
        products.Add(product);
 
    }
 
    return products;
 
}



From Form

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }
 
    private void Form1_Load(object sender, EventArgs e)
    {
        IProductDal productDal = new ProductDal();
 
        dgwProduct.DataSource=productDal.GetAll();
 
    }
}

Try Catch


Try Catch bloklarında birden fazla özel catch bloğu yazılabilir ve spesifik bir hatanın izi sürülebilir..


static void Main(string[] args)
{
    try
    {
        string[] cities1 = new string[] { "Ankara,Adana,Ağrı" };
 
        cities1[3= "istanbul,Bartın,Antalya";
    }
    catch (IndexOutOfRangeException ex)
    {
        Console.WriteLine(ex.Message);  // Sonuç: Dizin, dizi sınırları...
    }
 
    catch (Exception ex)
    {
 
        Console.WriteLine(ex.Message);
    }
 
    Console.ReadLine();
 
}

Kendi Hata Durumlarımızı Takip Etmek ....

Örneğin DB üzeründe bir arama işlemi yapan kullanıcıya veri bulunamaz ise fırlatılacak bir hata tasarlayalım...

Ayrı bir sınıf olarak "NoRecordReturnException" sınıfını tanımlarız ve bunu Exception sınıfından inherit ederiz.

İşlemlerin yapılacağı metotun içinde bir if else bloğu ile hatayı tespit eder ve bu noktada new throw ile execption sınıfmızı fırlatırız..

Main blokta ise catch bloğunda kendi Exception sınıfımızı tanımlayarak hatayı yakalarız.

Hatanın mesajını özelleştirmek istersek Expection sınıfından miras aldığımız için Message() metodunu ezmeyi denediğimizde Message metodu ulaşılamaz olduğunu anlarız bunun için Exception sınıfımızda ctor oluşturduktan sonra Base klasa parametre olarak mesaj gövdesini yollarız.


class Program
  {
      static void Main(string[] args)
      {
          try
          {
              Find();
          }
          catch (NoRecordReturnException ex)
          {
              Console.WriteLine(ex.Message);
          }
 
          Console.ReadLine();
      }
 
      public static void Find()
      {
          List<Student> students = new List<Student>()
          {
          new Student() { Id = 1, Name = "Ali", Surname = "Desidero" },
          new Student() { Id = 2, Name = "Aliy", Surname = "Yesidero" },
          new Student() { Id = 3, Name = "Alin", Surname = "Nesidero" }
 
          };
 
          var result = students.FirstOrDefault(s=>s.Id==4);
 
          if (result!=null)
          {
              Console.WriteLine("Record Found");
          }
          else
          {
              throw new NoRecordReturnException("Kayıt bulunamadı");
          }
      }
 
  }
  class Student
  {
      public int Id { getset; }
      public string Name { getset; }
      public string Surname { getset; }
  }
 
  public class NoRecordReturnException : Exception
  {
      //message metotu ezilemediği için 
      //Exception klasına iletip oradan çaığrıyoruz.
      public NoRecordReturnException(string message):base(message)
      {
 
      }
       
  }


Aynı kodları Action Delegate ilede yazarsak.

HandleException adlı bize ait bir metot yazarız ve parametre olarak Action tipinde bir değer yollanır. Action aslında parametre olarak metotları yollayabileceğimiz yöntemdir. Buradada action olarak Find() metotunu  yollar ve HandleException > try bloğunun içinde Invoke ile Find() metotunun çalışmasını sağlarız.
Find metotu > Else içinde hata fırlatılır böylece NoRecordReturnExp sınıfı ctor'da newlenirken, miras olarak alınan fakat ezilemeyen Message() metotuna ulaşmak için base klasa string olarak ekrana yazdıracağımız mesajı iletiriz. HandleException > catch bloğundada hata yakalanır ve mesaj ekrana iletilir...


class Program
  {
      static void Main(string[] args)
      {
 
          HandleException(() =>
          {
              Find();
          });
 
          Console.ReadLine();
      }
 
      public static void Find()
      {
          List<Student> students = new List<Student>()
          {
          new Student() { Id = 1, Name = "Ali", Surname = "Desidero" },
          new Student() { Id = 2, Name = "Aliy", Surname = "Yesidero" },
          new Student() { Id = 3, Name = "Alin", Surname = "Nesidero" }
 
          };
 
          var result = students.FirstOrDefault(s => s.Id == 4);
 
          if (result != null)
          {
              Console.WriteLine("Record Found");
          }
          else
          {
              throw new NoRecordReturnException("Kayıt bulunamadı");
          }
      }
 
      public static void HandleException(Action action)
      {
          try
          {
              action.Invoke();
          }
          catch (Exception ex)
          {
 
              Console.WriteLine(ex.Message);
          }
      }
 
  }
  class Student
  {
      public int Id { getset; }
      public string Name { getset; }
      public string Surname { getset; }
  }
 
  public class NoRecordReturnException : Exception
  {
      //message metotu ezilemediği için 
      //Exception klasına iletip oradan çaığrıyoruz.
      public NoRecordReturnException(string message) : base(message)
      {
 
      }
 
  }




Değer ve Referans Tip


Değer Tipler: Integer, double, float, bool


Referans Tipler: Interface, Abstract Class , String, Array


Eğer n1 değer bir tipe,  ref keywordü ile bir atama yapılırsa , artık bundan sonraki tüm işlemlerde bu atanan değer dödürülür.

static void Main(string[] args)
  {
      int number1 = 10;
 
      number1 = 30;
 
 
      NormType(number1);     // Sonuç 30
 
      RefType(ref number1);  // Sonuç 100
 
      NormType(number1);     // n1 değeri ref ile artık değişmiştir: Sonuç 100 
 
      Console.ReadLine();
 
 
 
      void NormType(int _number1)
      {
          Console.WriteLine("Nor Değer Nm1: {0}", number1);
      }
 
 
      void RefType(ref int _number1)
      {
          number1 = 100;
          Console.WriteLine("Ref Değer Nm1: {0}", number1);
      }
 
 
 
  }



Referans tiplerde ise c2 fereans tip c1 referans tipine eşitlenirse  c2'nin bellekte tutulan değerleri artık kullanılmadığı için bir müddet sonra Garbage collector tarafından silinir.

static void Main(string[] args)
{
    string[] cities1 = new string[] { "Ankara,Adana,Ağrı" };
    string[] cities2 = new string[] { "Bursa,Bolu,Balıkesir" }; // GC siler
 
    cities2 = cities1;
 
    cities1[0= "istanbul,Bartın,Antalya";
 
    foreach (var item in cities2)
    {
        Console.WriteLine(item); // Sonuç  "istanbul,Bartın,Antalya"
    }
 
 
    Console.ReadLine();
 
}



Statik metotlar


Bir klasın içine hem statik hemde statik olmayan iki metot tipi yazılabilir. Statik Metotları'da ilgili sınıfı new'lemeden çağırabiliriz. Eğer Sınıf statik olursa tüm metotlar statik olmak zorundadır.

class Program
{
    static void Main(string[] args)
    {
        Manager.Delete();           // Statik metot 
 
        Manager manager = new Manager();
        manager.Add();              // statik olmayan metot
 
        Console.ReadLine();
    }
}
 
 
class Manager
{
 
 
    public void Add()
    {
 
    }
 
    public static void Delete()
    {
 
    }
 
}

Base Sınıfın Constructor Metoduna Parametre Yollama


Örn: Farklı Db kullanılan bir yapıda Base sınıfa, ilgili her bir işlem için gereken farklı connection stringleri yollamak için kullanılabilir.




        static void Main(string[] args)
    {
        PersonManager personManager = new PersonManager("Sql Connection");
        personManager.Message(); // Sonuç "Sql connection message"
 
        Console.ReadLine();
    }
}
 
 
class BaseClass
{
    private string _entity;
    public BaseClass(string entity)
    {
        _entity = entity;
    }
 
    public void Message()
    {
        Console.WriteLine("{0} message", _entity);
    }
 
}
 
class PersonManager:BaseClass
{
 
    public PersonManager(string entity):base(entity)
    {
 
    }
}

Constructor Injection



Constructor Metotlar, bir sınıf her yenilendiğinde çalışan ana sınıf metotlarıdır. Bu metotlar ile bir sınıf oluşturulurken, ihtiyaç olan tüm parametre yada işlemler gerçekleştirilebilir.

Örneğin; Veri tabanına her kayıt işleminden sonra log tutmak istersek, sınıf içine private olarak bir Log Interface tipinde bir değişken tanımlanır. CustomerManager nesnesi her new'lendiğinde bu sınıfın Yapıcı Constructor metoduna parametre olarak bir ILogger set ederek yollanan ILogger nesnesini tanımladığımız ILogger nesenesine atarız. Sınıf metotları içinde çağırarak log işlemini tutabiliriz.

DipNot:
Statik sınıflar Constructor edinemezler!
Bir sınıf birden fazla parametreli yada parametresiz constructor edinebilir.


class Program
{
    static void Main(string[] args)
    {
        CustomerManager customerMan = new CustomerManager(new DatabaseLogger());
        customerMan.Add(); // Sonuç CustomerAded  - Logged to DataBase
 
        Console.ReadLine();
    }
}
 
class CustomerManager : ICustomerManager
{
    private ILogger _logger;
 
    public CustomerManager(ILogger logger)
    {
        _logger = logger;
    }
 
    public void Add()
    {
        Console.WriteLine("CustomerAded");
 
        _logger.Log();
    }
}
 
class DatabaseLogger : ILogger
{
    public void Log()
    {
        Console.WriteLine("Logged to DataBase");
    }
}
 
class FileLogger : ILogger
{
    public void Log()
    {
        Console.WriteLine("Logged to File");
    }
}
 
interface ILogger
{
    void Log();
 
}

25 Ağustos 2019 Pazar

Task & async & await


Video'yu izlemek için aşağıdaki bağlantıyı takip edin.

Task, Await, and Asynchronous Methods

Çıplak Bir Sınıf!


Eğer bir sınıf çıplak ise (Inheritance yada Interfaces almamış ise) o sınıftan kork!
Her zaman bu sınıfı new'lemen gerekir.

Abstract Sınıflar


Keyword'u "abstract" olarak kullanılır.
Abstract sınıflar new'lenemezler.
Interface ve virtual metotların bir arada kullanımı gibi düşünülebilir.
Abstract sınıf içerisinde "abstract" keywordü ile tanımlanan metotların gövdeleri olamaz.(Tıpkı interfacelerde tanımlanan metotlar gibi)


Örneğin farklı aracı kurumlara emir yollamadan önc,e her işlemde ortak kullanılacak, son fiyatı alan bir GetPrice() metotu ile ilgili kuruma emir yollayacak SendOrder() metotu tanımlamak gerektiğinde, ayrıca bir Interface ve Base sınıf tanımlamak yerine bu iki özelliği bir arada kullanabliceğimiz bir Abstract sınıf tanımlanabilir.

class Program
{
    static void Main(string[] args)
    {
        Order order = new IsyatirimOrder();
        order.Getprice();        // Sonuç: Price getted by defult"
        order.SendOrder();       // sonuç: Order sent to İşyatırım"
 
        Order order2 = new OsmanliMenkulOrder();
        order.Getprice();        // Sonuç: Price getted by defult"
        order.SendOrder();       // sonuç: Order sent to OsmanlıMenkul"
 
        Console.ReadLine();
 
    }
}
 
 
abstract class Order
{
    // Tıpkı bir gerçek sınıf gibi , 
    // miras alınan sınıflarda ortak kullanılabilinecek metot ekledik.
 
    public void Getprice()              
    {
        Console.WriteLine("Price getted by defult");
    }
 
 
    // Bir interface gibi zorunlu kullanılacak metotu tanımladık.
 
    public abstract void SendOrder(); 
    
}
 
class IsyatirimOrder : Order
{
    public override void SendOrder()
    {
        Console.WriteLine("Order sent to İşyatırım");
    }
}
 
class OsmanliMenkulOrder : Order
{
    public override void SendOrder()
    {
        Console.WriteLine("Order sent to OsmanliMenkul");
    }
}

Virtual Methods

"Ortak kullanılacak temel operasyonlar vardır. Fakat isteyen istediği metotu ezerek kendine göre kullanabilir."

Virtual metotlarda virtual - override keywordleri ile çalışılır.
Virtual metotların gövdesi, kod bloğu olmak zorundadır.

Inheritance yapılırken bir metot içerisinde tanımlanan genel işlemler, inherit alan başka bir sınıfta özel ihtiyaçlara göre kullanılmak isteniyorsa bu metot "virtual" olarak tanımlanır ve  inherit alan sınıf içerisinde bu metot "override" keywordu ile çağırılarak içersine istenilen özelleştirme yapılabilir.

Örneğin Databese sınıfında tanımlanmış genel bir Add() metotu, intherit alan MySql ve Sql sınıflarından Sql sınıfı içerisinde farklı işlemler yazılarak kullanılması gerekebilir. Bu durumda Sql sınıfında bu metot override edilerek çağırılır. Böylece MySql.Add() metotu, Base sınıftaki Add() metotunu kullanır. Sql.Add() metotu ise override edilen kendi sınıfı içindeki Add() metotunu kullanır.

Proje de Interface mi, Inheritance mı kullanmalıyım sorusunda, eğer böyle bir özelleştirmeye ihtiyacınız varsa, bu yönetimi interfaceler ile kullanamayız.

class Program
{
    static void Main(string[] args)
    {
        Sql sql = new Sql();
        MySql mySql = new MySql();
 
        sql.Add();      // Sonuç "Added by overrided Sqlcode!"
        mySql.Add();    // Sonuç "Added by default code"
 
        sql.Delete();   // Sonuç "Added by default code"
        mySql.Delete(); // Sonuç "Added by default code"
 
        Console.ReadLine();
    }
 
}
 
class Database
{
    public virtual void Add()
    {
        Console.WriteLine("Added by default code");
    }
 
    public void Delete()
    {
        Console.WriteLine("Deleted by default code");
    }
 
}
 
class Sql : Database
{
    public override void Add()
    {
        Console.WriteLine("Added by overrided Sqlcode!");
        //base.Add();
    }
 
}
 
class MySql : Database
{
 
}



23 Ağustos 2019 Cuma

Interfaces

Interface'ler (Arayüzler) sınıfları gruplandırmak, bu sınıflarda zorunlu olarak ortak kullanılacak metotlar, delegate, indexer yada propertiesleri tanımlamak için oluşturulan tanımlayıcı yada gruplandırıcı yapılardır.

"I" ile başlayarak isimlendirilmesi genel kabul görmüş bir kuraldır.
Bir sınıfa yalnızca bir tane ana sınıftan inhetir alırken , Interface'ler ilgili sınıfa birden fazla kez tanımlanabilir.

Interface'ler ierisinde kod bloğu bulunamaz. Sadece kullanılacak metotun ismi tanımlanır.
Interface'ler soyut olduğu için new'lenemezler, field kabul etmezler.

InterFaceler birbirlerine eklenebilirler.
Örn:
 ICustomerDal : ICustomerDal2 : ICustomerDal3


class Program
{
    static void Main(string[] args)
    {
 
        CustomerManager customerManager = new CustomerManager();
        customerManager.Add(new OracleCustomerDal());
        Console.ReadLine();
 
    }
}
 
interface ICustomerDal
{
    void Add();
    void UpDate();
    void Delete();
}
 
class SqlServerCustomerDal : ICustomerDal
{
    public void Add()
    {
        Console.WriteLine("Sql Added");
    }
 
    public void Delete()
    {
        Console.WriteLine("Sql Deleted");
    }
 
    public void UpDate()
    {
        Console.WriteLine("Sql Updateded");
    }
}
 
 
class OracleCustomerDal : ICustomerDal
{
    public void Add()
    {
        Console.WriteLine("Oracle Added");
    }
 
    public void Delete()
    {
        Console.WriteLine("Oracle Deleted");
    }
 
    public void UpDate()
    {
        Console.WriteLine("Oracle Updateded");
    }
 
}
 
class CustomerManager
{
    public void Add(ICustomerDal customerDal)
    {
        customerDal.Add();
    }
 
}

MVC LOADING TOO SLOW ISSUE