2009-07-24 11 views
6

W wstrzykiwania zależności Ninject, o ile skonfigurować powiązanie z klasą do siebie tak:W programie Ninject, w jaki sposób można uruchomić niestandardowy kod obiektu po utworzeniu za pomocą Bind <..> .ToSelf()?

Bind<SomeClass>().ToSelf(); 

Ninject bardzo ładnie rozwiązuje wszelkie zależności SomeClass ma i daje przedmiot z powrotem. Chcę móc coś zrobić w SomeClass, który powraca za każdym razem, gdy tworzy nowy, tak jak w przypadku przetwarzania końcowego. Mógłbym użyć wiązania .ToMethod (lub ToFactoryMethod) do jawnego dodania go, ale chciałbym, aby wszystkie jego zależności zostały rozwiązane wcześniej przez Ninject.

To wouldu być miło zrobić coś takiego:

Bind<SomeClass>() 
    .ToSelf() 
    .After(sc => sc.MethodIWantToCall()); // then after here, Ninject returns the object. 

Czy istnieje jakiś sposób, aby to zrobić w Ninject 1.0/1.1?

+0

Czy wystąpił problem z wykonaniem zadania, które chcesz wykonać w konstruktorze? –

+1

Przypuszczam, że nie ma w tym nic złego i to jest praktyczne rozwiązanie :) Ale pomyślałem, że być może, do testowania lub może niektórych rzeczywistych scenariuszy, MethodIWantToCall() może być uważana za część obiektu * aktywacja *, która Przechodzę do Ninject, a nie do implementacji. Ale zgodziłbym się, że to może być drobna uwaga. – ZeroBugBounce

Odpowiedz

11

Jeśli nie możesz umieścić kodu, który chcesz wykonać w konstruktorze, możesz wdrożyć IInitializable lub IStartable. Ten pierwszy zapewnia metodę Initialize(), która jest wywoływana po zakończeniu wszystkich iniekcji, a druga zapewnia zarówno metodę Start(), jak i Stop(), wywoływaną odpowiednio podczas aktywacji i dezaktywacji.

+2

Dziękujemy! I dzięki za Ninject :) – ZeroBugBounce

9

Wpadłem na ten sam problem, ale nie mogłem użyć rozwiązania Nate'a, ponieważ nie mogłem wykonać narzędzia typu IInitializable. Jeśli jesteś w podobnej łodzi, można użyć .OnActivation i uniknąć konieczności zmiany definicji typów docelowa:

Bind<SomeClass>().ToSelf().OnActivation(x => ((SomeClass)x).MyInitialize()); 

Można zobaczyć, jak nazywamy jakiś sposób arbitralny inicjalizacji (MyInitialize) po aktywacji (instancji) klasy.

Ma to tę zaletę, że nie wypala w trudnej zależności od Ninject w swoich własnych klasach (oczywiście poza modułami), dzięki czemu Twoje typy pozostają niezmienione w stosunku do struktury DI, której używasz.

Powiązane problemy