2011-01-13 23 views
6

Jestem nowy w tym biznesie IoC i DI- Czuję, że otrzymuję tę koncepcję, jeśli przekazujesz obiekty o zasięgu globalnym, ale nie dostaję jak to działa, gdy trzeba przekazać obiekt, który ma określony stan logiczny. Na przykład, jeśli chciałbym wstrzyknąć obiekt osoby do obiektu polecenia zapisu, to w jaki sposób mógłbym dynamicznie wybrać właściwy obiekt osoby? Z tego, co widziałem, mógłbym domyślnie skonstruować obiekt, ale moim rozłączeniem jest to, że nie używałbyś domyślnego obiektu osoby, musiałby być dynamiczny. Zakładam, że kontener IoC może po prostu utrzymywać stan obiektu dla ciebie, gdy zostanie on przekazany, ale wtedy wydaje ci się, że masz do czynienia tylko z jednym obiektem, ponieważ nie byłoby żadnego bezpieczeństwa wątku, prawda? Wiem, że czegoś mi brakuje (może coś w stylu factoryclass), ale potrzebuję trochę więcej informacji o tym, jak to zadziała.IoC Dependency Injection dla obiektów stanowych (nie globalnych)

Odpowiedz

6

Zawsze możesz wstrzyknąć odbiorcy numer Abstract Factory i użyć go do utworzenia obiektów o zasięgu lokalnym.

Jest to czasami konieczne. Patrz następujące przykłady:

Jednak generalnie mamy tendencję, aby nie używać DI dla jednostek, ale przede wszystkim dla Usług. Zamiast tego jednostki są zazwyczaj tworzone za pośrednictwem jakiegoś repozytorium.

+0

A więc, ogólnie, jednostki nie byłyby w ogóle częścią infrastruktury DI? Czy to komplikuję? – mytwocents

+1

Zgadza się: jednostki i obiekty wartości mają tendencję do życia odrębnymi życiem. W pewnym sensie nadal są one w jakiś sposób zarządzane przez infrastrukturę DI (najlepiej wszystko), ale w bardzo pośredni sposób. Zazwyczaj są one odczytywane i zapisywane do stałego magazynu za pośrednictwem repozytoriów lub tym podobnych, a * te * są Usługami, które są częścią infrastruktury DI. –

+0

OK, myślałem, że szef DI mówił, że obiekt osoby Enitity powinien zostać udostępniony z kontenera IoC (poprzez konfigurację) ... – mytwocents

4

Podczas konstruowania obiektu usługi (np. WriteFileService) wprowadzasz do niego rzeczy, których wewnętrznie potrzebuje do wykonania jego pracy. Być może potrzebuje obiektu systemu plików lub czegoś takiego.

Obiekt Person w twoim przykładzie powinien zostać przekazany do obiektu usługi jako parametr wywołania metody. na przykład writeFileService.write(person)

+0

Więc nie wstrzyknąłbyś WriteFileService do obiektu Entity osoby ... tak w tym przypadku, widzę, jak Entity mogą być używane bez infrastruktury DI. Mimo że WriteFileService najprawdopodobniej używał infrastruktury DI podczas jej tworzenia (w oparciu o zapotrzebowanie na wstrzykniętą klasę, która zapisuje do określonego wyjścia, np.WriterA - zapisuje do bazy danych, WriterB - prawa do konsoli itp ...). – mytwocents

Powiązane problemy