Generalnie tworzenie klas metodami, ale bez pól i właściwości, ma dużo narzutów?Jak szybkie jest tworzenie instancji klas za pomocą metod, ale bez pól i właściwości?
Pracuję nad aplikacją ASP.NET MVC, która intensywnie korzysta z wtrysku konstruktora, a niektóre sterowniki mają do 10 zależności. Ale ze względu na dużą liczbę zależności, że ucieka się do IMyAppServiceProvider
interfejs i klasy udostępniającej rodzajowy dostęp do wszystkich zależności, przez DependencyResolver w MVC 3.
ja wyrwane całe specyficzny kod aplikacji i stworzył z Gist moja podstawowa konfiguracja (nie dotyczy to jednak poniższej konfiguracji BaseController).
Utworzyłem również klasę BaseController, która akceptuje IMyAppServiceProvider
. Wszystkie kontrolery dziedziczą z tej klasy bazowej. Klasa podstawowa pobiera obiekt IMyAppServiceProvider
i ma zmienne chronione dla wszystkich różnych usług. Kod wygląda mniej więcej tak:
public class BaseController
{
protected IService1 _service1;
protected IService2 _service2;
protected IService3 _service3;
// ...
public BaseController(IMyAppServiceProvider serviceProvider)
{
_service1 = serviceProvider.GetService<IService1>;
_service2 = serviceProvider.GetService<IService2>;
_service3 = serviceProvider.GetService<IService3>;
// ...
}
}
To sprawia, że kod dla kontrolerów jest "skrzypiący w czystości". Brak zmiennych prywatnych/chronionych, żadnych przydziałów w konstruktorze i usług odwołują się do zmiennych chronionych klasy podstawowej. Jednak każde żądanie będzie tworzyło każdą usługę, z której korzysta moja aplikacja, niezależnie od tego, czy dany kontroler używa ich wszystkich.
Moje usługi są proste i zawierają tylko wywołania metod z pewną logiką biznesową i interakcją z bazą danych. Są bezpaństwowcami i nie mają pól ani właściwości klasy. Dlatego tworzenie instancji powinno być szybkie, ale zastanawiam się, czy jest to najlepsza praktyka (wiem, że jest to termin obciążony).
Jak zawsze, profil pierwszy. Jednak przypuszczam, że rozwiązywanie zależności jest wolniejsze niż tworzenie ich instancji. –
@insta Wow, nie widziałem lasu przez drzewa. Ale czy Ninject i/lub inne zależności od bufora kontenerów IoC? –
Dodałem poniżej odpowiedź, która powinna ci pomóc ... Już wcześniej wpadłem na ten sam problem. Większość osób (włącznie z mną) nie wie, że można zastąpić fabrykę kontrolera ASP.NET MVC używa do tworzenia kontrolerów. Niestandardowe można ściśle zintegrować pojemnik IoC i buforować zależności, które są potrzebne. –