Mamy projekt napisany w ASP.NET MVC i używamy NInject do wstrzyknięcia repozytoriów do kontrolerów. Obecnie używamy właściwości i Inject-atrybut wstrzyknąć repozytoriów, który działa dość dobrze:Jaki jest najlepszy sposób na wstrzyknięcie repozytoriów do kontrolera ASP.NET
[Inject]
public IMyRepository MyRepos {get;set;}
Alternatywnym sposobem wstrzykiwanie byłoby to zrobić „ręcznie” za pomocą NInjectServiceLocator
:
var myRepos = NInjectServiceLocatorInstance.Resolve<IMyRepository>();
Teraz zastanawiałem się nad następującą: pierwsza metoda wymaga, aby wszystkie repozytoria były umieszczone na górze (niekoniecznie na szczycie, ale jest to najbardziej logiczne miejsce) kontrolera. Za każdym razem, gdy zostanie wysłane żądanie, NInject tworzy instancję każdego repozytorium. Dzieje się tak niezależnie od tego, czy wszystkie repozytoria są rzeczywiście potrzebne w konkretnej Akcji.
Druga metoda pozwala bardziej precyzyjnie kontrolować, które repozytoria są rzeczywiście potrzebne, a tym samym może zaoszczędzić trochę narzutu podczas tworzenia kontrolera. Ale prawdopodobnie musisz również dołączyć kod, aby pobrać to samo repozytorium w wielu miejscach.
Który z nich byłby lepszy? Czy lepiej po prostu mieć garść własności repozytoriów, czy lepiej rozwiązać repozytorium, które jest rzeczywiście niezbędne do wykonania określonego działania, kiedy i gdzie jest ono potrzebne? Czy za wstrzyknięcie "bezużytecznych" repozytoriów nałożono karę wykonania? Czy istnieją (nawet ;-) lepsze rozwiązania?
Wywołanie 'NInjectServiceLocatorInstance.Resolve' to wzorzec o nazwie Service Locator. Dużo o tym pisano na Stackoverflow i w internecie (na przykład jest to [sławny artykuł] (http://blog.ploeh.dk/2010/02/03/ServiceLocatorisanAnti-Pattern/)). – Steven
@Steven: Wiem o schemacie i jego zaletach i wadach. Jak już powiedziałem, korzystanie z lokalizatora usług może nadal nie być najlepszym rozwiązaniem, ale czy w tym przypadku byłoby lepiej niż zastrzyk nieruchomości lub konstruktora? – Pieter
Jest to kolejność, w jakiej należy wykonać wstrzyknięcie: Wstrzyknięcie konstruktora, wstrzyknięcie właściwości, fabryki, wstrzyknięcie metody, lokalizator usługi. Wybierz tylko następną opcję, jeśli poprzednia nie jest odpowiednia. – Steven