2009-01-27 9 views
7

Mam app usług NET 3-tier, który jest zgodny ze standardowym podejściem:Wstrzykiwanie zależności w aplikacji n-warstwowej?

Frontend -> Object Model/Business Logic -> Data Access 

Próbuję dowiedzieć się o wstrzykiwania zależności wzdłuż drogi, a do tej pory znalazłem to wielki (używając Autofac) . Każdy z 3 poziomów musi tworzyć zestaw obiektów, czasami z dodatkową konfiguracją/etc. Wygląda na to, że pojemnik DI powinien być idealnym rozwiązaniem, ale mam pewne problemy z tym, gdzie powinien on żyć w stosunku do reszty systemu.

Obecnie mam klasę w interfejsie, która konfiguruje kontener DI. Jest to po prostu wielka paczka kodu mówiącego: container.Register<SomeType>() i tak dalej.

Problem polega na tym, że konfiguruje kontener dla wszystkich 3 poziomów, a zatem musi posiadać dość inwazyjną wiedzę na temat warstwy dostępu do danych. Posiadanie w moim interfejsie kodu z taką wiedzą uruchamia dzwonki alarmowe w mojej głowie, ponieważ punktem oddzielania aplikacji na poziomy jest unikanie tej dokładnej sytuacji.
Pogorsza się również fakt, że moja warstwa dostępu do danych to nie tylko serwer SQL, który jest głupim wiadrem bitów, ale składa się z wielu skomplikowanych wywołań COM Interop i P/Invoke, więc ma duży wpływ na konfiguracja DI.

Dałem trochę do myślenia, aby to zepsuć - być może mając jeden kontener na jeden poziom lub mając klasę "Setup" w każdej warstwie, która rozmawia z globalnym kontenerem DI, aby zarejestrować własne bity, ale nie jestem pewien jeśli to spowoduje więcej problemów niż rozwiązuje ...

Byłbym bardzo wdzięczny, gdyby ktokolwiek mógł podzielić się swoimi doświadczeniami w korzystaniu z DI z aplikacjami wielowarstwowymi.

Dzięki, Orion.

+0

Czy masz coś, co przypomina warstwę usługi? Tak, aby twój front-end współdziałał z nim przed obiektami biznesowymi. – BuddyJoe

+0

Nie jestem pewien, czy podążam za tym, co masz na myśli, mówiąc o "warstwie usługowej" ... "usługa" jest takim nadużywanym terminem ogólnym :-( –

Odpowiedz

2

To zależy od tego, czy masz trzy poziomy (separacja fizyczna) lub czy wszystkie warstwy logiczne są rozmieszczone razem. Jeśli frontend jest oddzielony od BL i komunikuje się za pośrednictwem usługi sieciowej lub WCF, to frontend i backend wymagają własnych kontenerów, ponieważ działają w oddzielnych procesach lub oddzielnych maszynach. Kontenery rejestrowałyby tylko własne komponenty i interfejsy "następnej" warstwy.

Z drugiej strony, jeśli wszystkie warstwy są uruchomione w tym samym procesie, wówczas należy mieć tylko jeden kontener. Kontener zostanie zainicjowany i hostowany w punkcie początkowym aplikacji, np. Global.asax dla aplikacji internetowej.

Problem z hostem kontenera, który zna wiele różnych części systemu, można rozwiązać, nie rejestrując klas pojedynczo, lecz rejestrując wszystkie typy w zespole. W ten sposób nie potrzebujesz silnych referencji do wszystkich złożeń w twoim rozwiązaniu tylko po to, aby skonfigurować kontener. Przykład, jak można to zrobić z Castle Winsdor:

Kernel.Register(AllTypes.Pick().FromAssemblyName("DataAccessLayer.dll")); 
Kernel.Register(AllTypes.Pick().FromAssemblyName("BusinessLogic.dll")); 
Powiązane problemy