W poprzednim poście starałem się przedstawić podstawowe różnice między trzema głównymi sposobami rejestracji usług dostępnymi w Autofacu. Kontener ten oferuje szerokie możliwości, dobre czasy „wyciągania” usług, ma także grono wiernych użytkowników. Jednak jeśli spojrzymy na statystyki pobrań paczek nugetowych na stronie nuget.org, to szybko się przekonamy, że nie jest to najpopularniejszy kontener IoC, a większym zainteresowaniem cieszy się choćby Unity czy tytułowy Ninject. I właśnie temu ostatniemu chcę się przyjrzeć bliżej w dzisiejszym wpisie. Ninject Ninject, podobnie jak Autofac, jest rozwijany jako open source, dzięki czemu uzyskujemy łatwy dostęp do kodu źródłowego tego kontenera. Aby skorzystać z tej biblioteki, wystarczy zainstalować paczkę nugetową. Można również skorzystać z gotowych rozwiązań przygotowanych pod konkretne wdrożenia. Mamy tutaj choćby dedykowane paczki do MVC czy WCF. Szerszą dokumentację można znaleźć na stronie wiki na Githubie.   Jak zacząć?  Po zainstalowaniu paczki nugetowej możemy rozpocząć tworzenie pierwszej aplikacji wykorzystującej kontener IoC. Dla kontrastu z Autofacem wykorzystam interfejsy i klasy napisane w poprzednim poście. Poniżej kod:   [sourcecode language="csharp"] public interface IOutput { void Write(string content); } public class ConsoleOutput : IOutput { public void Write(string content) { Console.WriteLine(content); } } public interface IDateWriter { void WriteData(); } public class TodayWriter : IDateWriter { private readonly IOutput _output; private int counter = 0; public TodayWriter(IOutput output) { this._output = output; } public void WriteData() { ++counter; this._output.Write(DateTime.Today.ToShortDateString()); this._output.Write($"{this.GetHashCode()}_{counter}"); } } [/sourcecode]   Przygotujemy teraz klasę Program, która standardowo jest sercem każdej aplikacji konsolowej. Do rejestracji usług Ninject wykorzystuje tzw. kernele. To właśnie za ich pomocą decydujemy, czy klasa ma być zarejestrowana jako singleton, czy też dla każdego żądania powinniśmy dostawać nowy egzemplarz (zachowanie domyślne). W skrócie jest to więc podejście bardzo podobne do Autofaca, z tym że wykorzystujemy tutaj inne klasy. W Ninject funkcjonuje również Scope, aczkolwiek w trochę inny sposób niż w konkurencyjnym rozwiązaniu.   Poniżej klasa Program:   [sourcecode language="csharp"] class Program { static void Main(string[] args) { IKernel kernel = new StandardKernel(); RegisterServices(kernel); WriteData(kernel); Console.ReadKey(); } public static void WriteData(IKernel kernel) { var writer = kernel.Get<IDateWriter>(); writer.WriteData(); var anotherWriter = kernel.Get<IDateWriter>(); anotherWriter.WriteData(); } private static void RegisterServices(IKernel kernel) { kernel.Bind<IOutput>().To<ConsoleOutput>(); kernel.Bind<IDateWriter>().To<TodayWriter>(); } } [/sourcecode]   Rezultat wywołania naszego programu wygląda następująco:   25.10.2016 62910583_1 25.10.2016 56230589_1   Sprawdźmy również, co się stanie, jeśli przerobimy metodę RegisterServices w taki sposób, by rejestrowała usługi jako singleton. Poniżej kod:   [sourcecode language="csharp"] private static void RegisterServices(IKernel kernel) { kernel.Bind<IOutput>().To<ConsoleOutput>().InSingletonScope(); kernel.Bind<IDateWriter>().To<TodayWriter>().InSingletonScope(); } [/sourcecode]   Poniżej rezultat zmodyfikowanej metody:   25.10.2016 60684095_1 25.10.2016 60684095_2   Zgodnie z oczekiwaniami mamy do czynienia z tym samym obiektem. Ninject jest bardzo prosty w użytkowaniu, istnieje sporo publikacji na ten temat i można liczyć na wsparcie w sieci. Niestety, nie jest to najszybszy kontener IoC. Więcej, powiedziałbym, że jest dość wolny, o czym wspomina się w licznych postach na blogach, m.in. w tym. Warto więc wybrać mądrze.    

Jerzy Piechowiak

Altcontroldelete.pl

 


 

 Szukasz informacji o C#? Kliknij TU lub zerknij poniżej: