Migrując moją aplikację ASP.NET na rdzeń ASP.NET i jedną funkcję, którą mam, jest to, że wszystkie moje kontrolery dziedziczą z kontrolera podstawowego, w którym robię:

protected override void Initialize(HttpControllerContext controllerContext)
{
    base.Initialize(controllerContext);

    string token = controllerContext.Request.Properties["token"] as string;
    user = UserCache.Get(token);

    //Called by derived controllers
    //to set their repository user
    SetInfo();
}

Czy muszę przenieść powyższy kod na Middleware? Czy oprogramowanie pośrednie pozwoli mi ustawić wywołanie metody SetInfo Controlers 'Setinfo?

5
Ivan-Mark Debono 16 luty 2017, 15:23

2 odpowiedzi

Najlepsza odpowiedź

Dlaczego nie zamieniaj go w leniwy właściwość kontrolera?

Jest miło, ponieważ teraz nie dostajesz użytkownika z pamięci podręcznej, jeśli go nie używasz.

private User _user;
public User user { get { return _user ?? (_user = UserCache.Get(this.Request.Properties["token"])); } }

Zadzwoń do inicjatora na konstruktorze

O SetInfo().

Proponuję przenieść ten kod do konstruktora lub gdzieś indziej (w zależności od zawartości tej funkcji). Kontroler jest tworzony po jego pracy Router. Przez IControllerFactory. Możesz przedłużyć DefaultConTrollerFactory . Ta klasa jest odpowiedzialna za tworzenie instancji kontrolera. (Upewnij się, że zarejestruj go w IServiceCollection, w przeciwnym razie Twoja klasa nie jest tym, który jest rozwiązany.

W twoim przypadku uważam, że najlepsze, aby przemyśleć swoją architekturę tutaj i skupić się na bycie tak bezpaństwowym, jak to możliwe, a nie korzystając z jednego z opisanych poniżej elementów.

Informacje MVC Rurociąg

W ten sposób działa rurociąg w MVC (i nadal działa w Aspnetcore). Wpisz opis obrazu tutaj Obraz z DotnetCurry

Dostęp do użytkownika wcześniej w rurociągu

Jeśli chcesz uzyskać dostęp do użytkownika gdzieś wcześniej w rurociągu żądania, sugerowałbym:

  • @dabouls Odpowiedź: Dodaj środkowe ware, aby wstrzyknąć go w http.items
  • Utwórz klasę Userrepository i zarejestruj go, aby zażądać zakresu w pojemniku IOC. + Użyj HttpContextAccessor, ale dostęp do httpContext.Current jest na ogół antiatorem i jest zniechęcony.
0
Joel Harkes 16 luty 2017, 15:26

W pierwszej części wygląda na to, że ekstrahujesz token do celu uwierzytelniania. Oprogramowanie pośrednie można skonfigurować do uruchomienia przed akcją kontrolera, ale to kwestia, jak przekazać informacje do kontrolera. Na przykład uwierzytelniający oprogramowanie Middleware po prostu ustawiłoby zleceniodę HTTPREQUEST, który mógłby zostać ponownie wykorzystany podczas wykonania kontrolera.

Jeśli chodzi o SetInfo, jeśli wyraźnie zależy od charakteru informacji, czy to dobry pomysł, czy nie używać oprogramowania pośredniego, aby to zrobić, ale jest to wykonalne. Na przykład w moim przypadku, w celu debugowania przyczyny w Dev, mam oprogramowanie pośrednie przekazujące informacje, kiedy moja sesja wygasa do mojego kontrolera, dodając go w HttpContext. Nie mówię jednak, że to dobra praktyka.

context.Request.HttpContext.Items.Add(ExpiresUTCEntry, context.Properties.ExpiresUtc);
1
Daboul 16 luty 2017, 17:22