Clear        


                
                    using _22_DependencyInjection.Logging.Repositories;

namespace _22_DependencyInjection.Logging
{
    public class LoggingDemo
    {
        public void Calistir()
        {
            #region 1) Constructor Injection
            // Genellikle kullanılan Dependency Injection yöntemidir.
            // Soyut olarak tanımlanan new'lenmiş bir objenin başka bir sınıfın constructor'ına 
            // parametre olarak gönderilmesi üzerinden gerçekleştirilir.

            #region I. Yöntem:
            /*
            ILogger logger = new FileLogger(); // ILogger tipinde bir değişken üzerinden FileLogger tipinde bir obje oluşturuyoruz,
                                               // eğer uygulamamızın veritabanına loglama yapmasını istiyorsak sadece bu satırı
                                               // ILogger logger = new DatabaseLogger();
                                               // olarak değiştirmememiz yeterli, dolayısıyla uygulamanın loglama işlemlerini
                                               // tek bir satırdaki tek bir değişiklik üzerinden yönetebiliyoruz

            ProductRepo productRepo = new ProductRepo(logger); // objeyi ProductRepo constructor'ına gönderiyoruz
                                                               // yani enjekte ediyoruz
            */
            #endregion

            #region II. Yöntem:
            ProductRepo productRepo = new ProductRepo(new FileLogger()); // ProductRepo sınıfına FileLogger objesi
                                                                         // new'lenerek parametre olarak gönderilebilir
            #endregion

            productRepo.Add(); // hem ürün eklendi mesajı hem de yukarıda eğer FileLogger tipinde obje enjekte edildiyse
                               // dosya loglama yapıldı mesajı, DatabaseLogger tipinde obje enjekte edildiyse
                               // veritabanı loglama yapıldı mesajı konsola yazdırılacak

            productRepo.Delete(); // hem ürün silindi mesajı hem de yukarıda eğer FileLogger tipinde obje enjekte edildiyse
                                  // dosya loglama yapıldı mesajı, DatabaseLogger tipinde obje enjekte edildiyse
                                  // veritabanı loglama yapıldı mesajı konsola yazdırılacak

            #endregion



            #region 2) Property Injection
            // Soyut olarak tanımlanan new'lenmiş bir objenin başka bir sınıfın new'lenmesi sırasında
            // sınıfın soyut olarak tanımlanan özelliğine atanması üzerinden gerçekleştirilir.

            #region I. Yöntem:
            /*
            ILogger logger = new DatabaseLogger(); // ILogger tipinde bir değişken üzerinden DatabaseLogger tipinde bir
                                                   // obje oluşturuyoruz, eğer uygulamamızın dosyaya loglama
                                                   // yapmasını istiyorsak sadece bu satırı
                                                   // ILogger logger = new FileLogger();
                                                   // olarak değiştirmememiz yeterli, dolayısıyla uygulamanın loglama işlemlerini
                                                   // tek bir satırdaki tek bir değişiklik üzerinden yönetebiliyoruz

            CategoryRepo categoryRepo = new CategoryRepo() // CategoryRepo tipindeki objeyi new'lerken sınıfın
                                                           // ILogger tipindeki özelliğine DatabaseLogger tipindeki
                                                           // objenin ILogger tipindeki referansını atıyoruz
                                                           // ve uygulamamızın veritabanında loglama işlemleri
                                                           // yapmasını sağlıyoruz
            {
                Logger = logger 
            };
            */
            #endregion

            #region II. Yöntem:
            CategoryRepo categoryRepo = new CategoryRepo()
            {
                Logger = new DatabaseLogger() // Logger özelliğine DatabaseLogger veya FileLogger objesi new'lenerek atanabilir
            };
            #endregion

            categoryRepo.Update();

            #endregion



            #region 3) Method Injection
            // Soyut olarak tanımlanan new'lenmiş bir objenin başka bir sınıfın methoduna parametre olarak
            // gönderilmesi üzerinden gerçekleştirilir.

            StoreRepo storeRepo = new StoreRepo(); // StoreRepo tipindeki objeyi new'liyoruz

            #region I. Yöntem:
            /*
            ILogger logger = new FileLogger(); // ILogger tipinde bir değişken üzerinden FileLogger tipinde bir
                                               // obje oluşturuyoruz, eğer uygulamamızın veritabanına loglama
                                               // yapmasını istiyorsak sadece bu satırı
                                               // ILogger logger = new DatabaseLogger();
                                               // olarak değiştirmememiz yeterli, dolayısıyla uygulamanın loglama işlemlerini
                                               // tek bir satırdaki tek bir değişiklik üzerinden yönetebiliyoruz

            // FileLogger olarak new'lenmiş ILogger tipindeki referans değişkenini içerisinde loglama işlemi yapmak
            // istediğimiz methodlara parametre olarak göndererek enjekte ediyoruz
            storeRepo.GetList(logger);
            storeRepo.GetDetails(logger);
            */
            #endregion

            #region II. Yöntem:
            // ILogger tipindeki parametre DatabaseLogger veya FileLogger new'lenmiş objesi olarak gönderilebilir,
            // bu da Constructor ve Property Injection'dan farklı olarak farklı methodlara ihtiyaca göre farklı
            // objeler enjekte etmemizi sağlar, oysa ki Constructor ve Property Injection üzerinden sadece tek tipte
            // bir obje enjekte edilebilir
            storeRepo.GetList(new DatabaseLogger());
            storeRepo.GetList(new FileLogger());
            #endregion

            #endregion
        }
    }
}