Ninject Console App

Odpowiedz Nowy wątek
2018-11-09 10:44
Szalony Mleczarztak
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();
        }

Pozostało 580 znaków

2018-11-09 10:46
0

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

Pozostało 580 znaków

2018-11-09 10:55
Szalony Mleczarztak
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");
    }
}

Pozostało 580 znaków

2018-11-09 11:02
Szalony Mleczarztak
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?)

Pozostało 580 znaków

2018-11-09 11:16
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.

Pozostało 580 znaków

2018-11-09 11:28
Szalony Mleczarztak
0

zrozumiałe. Jeszcze raz dzięki @john_klamka

Pozostało 580 znaków

2018-11-11 01:31
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.


"HUMAN BEINGS MAKE LIFE SO INTERESTING. DO YOU KNOW, THAT IN A UNIVERSE SO FULL OF WONDERS, THEY HAVE MANAGED TO INVENT BOREDOM."
w kontekście problemu opa na tym właśnie polega, gdybym mu zaczął pisać o ioc to raczej niewiele by z tego wyniósł - john_klamka 2018-11-11 08:33
W kontekście problemu IMessageService brzmi jakby nie potrzebowało interfejsu. - ._. 2018-11-11 12:36

Pozostało 580 znaków

2018-11-11 11:18
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.

Pozostało 580 znaków

2018-11-11 12:02
._.
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.

edytowany 1x, ostatnio: ._., 2018-11-11 12:41

Pozostało 580 znaków

2018-11-11 13:43
Uczynny Terrorysta
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.

To git. - ._. 2018-11-11 14:14

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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