Home Dependency Injection — Ninject Kullanımı
Post
Cancel

Dependency Injection — Ninject Kullanımı

Merhabalar, yaygın olarak kullanılan kütüphanelerden bir tanesi Ninject’tir. İncelemek için bir önceki Dependency Injection örneğinin aynısı üzerinden gideceğiz. Yaptığımız örnekle çok benzer olduğunu söyleyebilirim. Hatta standart Dependency Injection kullanımına göre birazdaha fazla kod yazdığımızı görebilirsiniz. Fakat kurumsal projelerde yaygın kullanımının arkasında yatan sebep sadece standart kullanımlarından ziyade, projelerimizde birden fazla loosely coupled yani gevşek bağlı yapıları kullanma gerekinimindeki karmaşıklığı en az seviyieye indirmektedir. Birden fazla gevşek bağlı yapı durumuna örneğimizde deyineceğiz. Öncelikle Nuget paketinden Install-Package Ninject şeklinde Ninject paketini projemize indirip kuruyoruz. Daha sonrasında interface ve implemente yapılacak class larımızı oluşturuyoruz.

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
28
interface ILogger
{
    void WriteLog(string message);
}

class TextLogger : ILogger
{
    public void WriteLog(string message)
    {
        Console.WriteLine("TextLogger : {0}", message);
    }
}

class XmlLogger : ILogger
{
    public void WriteLog(string message)
    {
        Console.WriteLine("XmlLogger : {0}", message);
    }
}

class DatabaseLogger : ILogger
{
    public void WriteLog(string message)
    {
        Console.WriteLine("DatabaseLogger : {0}", message);
    }
}

Bu aşamaya kadar bir önceki örneğimizin aynısını yapıyoruz. Daha sonra yine bir önceki örneğimizdeki gibi sınıfları yönetebilmemiz için LogManager yapısını oluşturuyoruz.

1
2
3
4
5
6
7
8
9
10
11
12
13
class LogManager  
    {  
        readonly ILogger logger;         
        [Inject]  
        public LogManager(ILogger logger)  
        {  
            this.logger = logger;  
        }        
        public void Handle(string message)  
        {  
            this.logger.WriteLog(message);  
        }  
    }

Bu sınıfımızdaki tek fark [Inject] tanımımlasıdır. LogManager yapısını kullanırken hangi sınıfı çağıracağımızı Ninject.Modules.NinjectModule sınıfınından ayarlayabilmekteyiz. Bu modül sınıfının en güzel yanı daha sonra ihtiyacımız olabilecek birden fazla gevşek bağlı yapılarımızın Bind işlemlerini yapabilmemizdir.

1
2
3
4
5
6
7
class Bindings : NinjectModule
{
    public override void Load()
    {
        Bind<ILogger>().To<DatabaseLogger>();
    }
}

Bu tanımlamanın anlamı ILogger tipindeki sınıf istendiğinde otomatik olarak DatabaseLogger sınıfını döndürecektir. Daha sonra Main sınıfımızın içerisinde ilgili kodları aşağıdaki gibi oluşturuyoruz.

1
2
3
4
5
6
7
8
9
10
class Program
{
    static void Main(string[] args)
    {
        IKernel kernel = new StandardKernel(new Bindings());
        LogManager logManager = kernel.Get<LogManager>();
        logManager.Handle("İşlem Tamamlandı.");
        Console.ReadLine();
    }
}

Bu kod parçasındaki dikkat edilmesi gereken nokta new StandartKernel içerisinde load metoduna Bindings sınıfımızı göndermektir. Bu şekilde yapılandırma sınıfını Ninject’e set etmiş oluyoruz. Birden fazla “gevşek bağlı” bir yapıyı aşağıdaki gibi yine NinjectModules yapsısındaki Bindings sınıfımız ile yapılandırabiliriz.

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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
interface IConnections
 {
     void GetConnectionString();
 }

 class MsSql : IConnections
 {
     public void GetConnectionString()
     {
         Console.WriteLine("Connection Type: MsSql");
     }
 }

 class EntityFramework : IConnections
 {
     public void GetConnectionString()
     {
         Console.WriteLine("Connection Type: EntityFramework");
     }
 }

 class MySql : IConnections
 {
     public void GetConnectionString()
     {
         Console.WriteLine("Connection Type: MySql");
     }
 }

 class ConnectionManager
 {
     readonly IConnections connections;

     [Inject]
     public ConnectionManager(IConnections connections)
     {
         this.connections = connections;
     }

     public void GetConnectionStr()
     {
         this.connections.GetConnectionString();
     }
 }   

Bindings sınıfımız içerisine aynı şekilde diğer Dependency Injection yapısının tanımını yapabiliriz.

1
2
3
4
5
6
7
8
class Bindings : NinjectModule
{
    public override void Load()
    {
        Bind<ILogger>().To<DatabaseLogger>();
        Bind<IConnections>().To<EntityFramework>();
    }
}

Main sınıfının içerisinde aynı şekilde yeni eklediğimiz IConnection yapımızı işleme alabiliriz.

1
2
3
4
5
6
7
8
9
10
11
12
class Program
{
    static void Main(string[] args)
    {
        IKernel kernel = new StandardKernel(new Bindings());
        LogManager logManager = kernel.Get<LogManager>();
        logManager.Handle("İşlem Tamamlandı.");
        ConnectionManager connectionManager = kernel.Get<ConnectionManager>();
        connectionManager.GetConnectionStr();
        Console.ReadLine();
    }
}

Bir sonraki makalede görüşmek üzere.

This post is licensed under CC BY 4.0 by the author.

Logo Objects Entegrasyon Ayarları

Asp.NET Core Web API - Hangfire Kullanımı