Ninject Console App

0

Hej, mam wątpliwość czy dobrze to robię. Mam jakieś serwisy i repozytoria. Pytanie jest w komentarzu
W taki sposób binduję

class AppInfrastructureNinjectModule : NinjectModule
    {
        public override void Load()
        {
            Bind<IMessageService>().To<MessageService>();
            Bind<IMessageRepository>().To<MessageRepository>();
            Bind<ISerwerTcpService>().To<SerwerTcpService>();
        }
    }

a w tem sposób używam

        private static async Task MainAsync(string[] args)
        {
            IKernel kernel = new StandardKernel(new AppInfrastructureNinjectModule());
            MessageService _messageService = kernel.Get<MessageService>(); // tutaj nie wiem czy ma być tak jak jest czy Get<IMessageService> ???

            await _messageService.GetReport();
        }
0

Cała idea kontenerów polega na oddzieleniu implementacji od interfejsu, więc odpowiadając na Twoje pytanie - powinieneś wstrzykiwać interfejs.

0

dzięki @john_klamka
a spójrz proszę tutaj https://github.com/ninject/ninject/wiki/Modules-and-the-Kernel

public class WarriorModule : NinjectModule
{
    public override void Load() 
    {
        Bind<IWeapon>().To<Sword>();
        Bind<Samurai>().ToSelf().InSingletonScope();
    }
}

class Program
{
    public static void Main() 
    {
        IKernel kernel = new StandardKernel(new WarriorModule());
        Samurai warrior = kernel.Get<Samurai>();
        warrior.Attack("the evildoers");
    }
}
0

gdy wstrzykuję IMessageService

        private static async Task MainAsync(string[] args)
        {
            IKernel kernel = new StandardKernel(new AppInfrastructureNinjectModule());
            MessageService _messageService = kernel.Get<IMessageService>();

            await _messageService.GetSmsReport();
        }

dostaję

Cannot implicitly convert type 'Services.Messages.IMessageService' to 'Services.Messages.MessageService'. An explicit conversion exists (are you missing a cast?)

0

Deklarujesz zmienną typu MessageService i chcesz do niej przypisać typ IMessageService, dlatego dostajesz błąd.

IMessageService _messageService = kernel.Get<IMessageService>()

albo nawet lepiej:

var messageService = kernel.Get<IMessageService>()

Generalnie chodzi o to, żebyś nie zakładał jaki konkretnie typ ma Twój message service, tylko jaki interfejs implementuje.

0

zrozumiałe. Jeszcze raz dzięki @john_klamka

2
john_klamka napisał(a):

Cała idea kontenerów polega na oddzieleniu implementacji od interfejsu, więc odpowiadając na Twoje pytanie - powinieneś wstrzykiwać interfejs.

Nie - idea kontenerów polega automatyzacji wstrzykiwania zależności, która zaś jest formą odwrócenia sterowania. Oddzielanie interfejsów od implementacji nie ma z tym nic wspólnego.

0

ServiceLocator to antypatern, ale w aplikacji konsolowej nie za bardzo innej opcji. Pobierz sobie z kontenera w Main tylko interfejs który jest punktem startowym apki a resztę zależności już wstrzykuj poprzez konstruktor.

0

Nie - idea kontenerów polega automatyzacji wstrzykiwania zależności, która zaś jest formą odwrócenia sterowania. Oddzielanie interfejsów od implementacji nie ma z tym nic wspólnego.

Chciałbym tylko dodać, że interfejsy w połączeniu z IOC najczęściej są efektem ubocznym Dependency Inversion (co ma sens), a kontener to forma Inversion Of Control realizowana przez Dependency Injection. Nie można tych wszystkich pojęć spłaszczać do jednego.

ServiceLocator to antypatern, ale w aplikacji konsolowej nie za bardzo innej opcji. Pobierz sobie z kontenera w Main tylko interfejs który jest punktem startowym apki a resztę zależności już wstrzykuj poprzez konstruktor.

W tym przypadku to nie jest ServiceLocator, ponieważ metoda main to twój "Composite Root".

ServiceLocator w niektórych przypadkach nie może być nazywany AntyPaternem. Np. w testach, jeśli oczywiście ktoś to lubi...

Jeśli Hej, mam wątpliwość czy dobrze to robię. Mam jakieś serwisy i repozytoria. Pytanie jest w komentarzu
W taki sposób binduję

Jeśli MessageService to punkt wejścia to nie potrzebujesz do tego interfejsu. Nie pamiętam Ninjecta poszukaj czegoś jak Bind As Self.

0

MessageService jest punktem wejscia. Zrobilem tak jak piszecie - reszte zaleznosci wstrzykuje w konstruktorze.
Uzylem interfejsu bo na trn moment imolementuje tylko jednego providera. Natomiast pojdzie to w kierunku rozwoju - innych implementacji.

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0