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.