using _22_DependencyInjection.Demos;
using _22_DependencyInjection.Logging;
namespace _22_DependencyInjection
{
internal class Program
{
static void Main(string[] args)
{
// Dependency Injection sınıflar veya modüller arası bağımlılıkları minimize etmek ve yönetmek için kullanılır.
// Örneğin Dependency Injection kullanılarak bir yazılım projesinde loglama mekanizması kolaylıkla
// veritabanı veya dosya loglama şekilnde değiştirilebilir.
// Genel amaç herhangi bir sınıfta değişiklik yapmadan o sınıftaki obje üzerinden
// değişiklikleri yönetebilmektir.
// Dependency Injection genellikle soyut yapılar yani abstract class'lar veya interface'ler üzerinden uygulanır.
// Veri tutan ve veri yönetilebilien sınıflar için Entity, Model veya DTO (Data Transfer Object) kavramları kullanılır,
// veri yönetilen sınıflar için Repository (Repo) kavramı kullanılırken service veya manager kavramları
// iş yapan sınıflar için kullanılır.
// Model'ler Service'lerde, Entity ve DTO'lar ise Repository'lerde kullanılır.
// Aşağıdaki örnekte ProductRepo ürün ekleme ve silme işlerini, CategoryRepo kategori güncelleme işini
// ve StoreRepo ise mağaza listeleme ve detay getirme işlerini yapan repository sınıflarıdır.
// Tight Coupling (Sıkı Bağlılık): Eğer bir sınıfta (örneğin A sınıfı) başka somut (concrete) bir sınıf
// üzerinden (örneğin B sınıfı) obje new'lenerek kullanılıyorsa bu iki yapı birbirine sıkı bağlıdır,
// çünkü A sınıfında B sınıfı ile ilgili değişiklik yapmak için B sınıfında değişiklik yapmak gerekir
// ve ihtiyaç durumunda B sınıfının eski halini kullanmak için yine B sınıfında değişiklikler yapmak gerekecektir.
// Loose Coupling (Gevşek Bağlılık): Eğer bir sınıfta (örneğin A sınıfı) başka soyut (abstract) bir sınıf veya interface
// üzerinden (örneğin B sınıfı veya interface'i) obje new'lenerek kullanılıyorsa veya sınıfa enjekte ediliyorsa
// bu iki yapı birbirine gevşek bağlıdır, çünkü soyut base sınıftan miras alan veya interface'i implemente eden
// başka somut (concrete) sınıflar (örneğin C ve D sınıfları) base B tipindeki referans değişkeni üzerinden
// ihtiyaca göre C veya D tipinde new'lenerek veya sınıfa base B tipi üzerinden new'lenip enjekte edilerek
// C ve D sınıflarında hiçbir değişiklik yapılmadan uygulamanın davranışı C veya D'ye göre kolayca değiştirilebilir.
// Genelde Dependency Injection kullanılarak uygulanan Loose Coupling'de enjekte edilecek objenin neler yapabileceğine
// ihtiyacımız olduğundan soyut yapılar (abstract class veya interface) kullanırız, dolayısıyla
// bu soyut base sınıflardan miras alan veya interface'leri implemente eden yeni somut sınıflar oluşturarak
// oluşturulan somut sınıflar üzerinden uygulamanın davranışlarını kolayca değiştirip yönetebiliriz.
#region Logging (Constructor, Property and Method Injections)
LoggingDemo loggingDemo = new LoggingDemo();
loggingDemo.Calistir();
#endregion
#region Araba ve Sürücü Demo
ArabaVeSurucuDemo arabaVeSurucuDemo = new ArabaVeSurucuDemo();
arabaVeSurucuDemo.Calistir();
#endregion
}
}
}