6

Niedawno uderzyłem w ceglany mur, kiedy dałem szansę na Ninject w projekcie, nad którym pracuję.Fabryka wtrysku zależności statycznych, dobra czy zła?

Przeszedłem przez wszelkiego rodzaju pytania, systematycznie prosząc o mój projekt i architekturę na rzecz zastrzyku zależności.

  1. Is this right to inject the container/kernel to the main application presenter?

  2. How to configure Ninject to use along with NHibernate in WinForms?

  3. Conditional dependency injection binding only when property not null

  4. What did I get wrong, DI or Design, and how should I go about it?

Po godzin i dni i godzin morza rwania, natknąłem się na ten artykuł od Justina Etheredge'a, który mówi o jego statycznej klasie DIFactory.

I teraz zastanawiam się, co to jest nie wszystko działa jak magia użyciu statycznej fabryki DI?

Chciałbym usłyszeć plusy i minusy używania statycznej fabryki DI w rzeczywistej aplikacji.

Czy IoC i DI są takie same, czy też są bardzo podobne, chociaż istnieją pewne różnice?

Odpowiedz

7

static DI Factory is a Service Locator, a Service Locator is an anti-pattern ponieważ pozwoli on trudno powodu o kod:

Jedyną zaletą lokalizatora usług jest to, że nieznacznieeasier to understand than Dependency Injection. Jednak DI nie jest tak trudne do uchwycenia once you get over a few conceptual hurdles.

Relacja między IoC i DI to DI is a special case of IoC.

+0

Co się stanie, jeśli niektórych typów nie można utworzyć w instancji podczas uruchamiania aplikacji, ponieważ do prawidłowego utworzenia wystąpienia będą potrzebne poświadczenia użytkownika? Na przykład, 'NHibernante.ISessionFactory' jest takim problemem, ponieważ nie można go utworzyć bez prawidłowego ciągu połączenia, a po utworzeniu nie pozwala zmienić łańcucha połączenia. Jako obejście można podać "IDbConnection" i traci pamięć podręczną drugiego poziomu, która przechowuje ślady obiektu w całym cyklu życia "ISession". Wówczas użytkownik musiałby podać swoje poświadczenia, a teraz zależność 'ISessionFactory' nie stanowi już problemu. –

+0

Czy to byłaby 'AbstractFactory', która pozwoliłaby na rejestrację nowych typów? Jak byś to zrobił? –

+1

Jeśli nie możesz rozwiązać podprogramu w czasie wykonywania, zawsze możesz dodać kolejną warstwę pośrednią. Fabryka abstrakcyjna byłaby jedną z opcji. Oto więcej informacji o [wdrażaniu abstrakcyjnej fabryki] (http://blog.ploeh.dk/2012/03/15/ImplementinganAbstractFactory). –