asp.net core mvc – areas

Blog prowadzony po polsku a tytuł po angielsku. Czasem ciężko jest dobrać polski odpowiednik 🙂
Dziś będzie o strefach (area = strefa), które wykorzystam także w projekcie dogevents.

Ale o co chodzi

Dla zobrazowania powiedzmy, że projektujemy rozbudowaną aplikację składa się z kilku sekcji (nie do końca ze sobą powiązanych). Pierwsze co mi przyszło do głowy do taki system ERP. Możemy w nim wyróżnić m.in takie moduły:

  • Kontrahenci 
  • Sprzedaż
  • Zamówienia
  • Księgowość
  • Administracja
Gdyby przenieść to na prostą strukturę kontrolerów w mvc mogłoby to wyglądać następująco:
Z czasem może okazać się, że jeden kontroler zacznie obsługiwać wiele funkcjonalności (w końcu planujemy system ERP 😉 ) i najzwyczajniej puchnąć. Zaczną powstawać nowe, struktura mocno się rozbuduje i poruszanie się po projekcie stanie się uciążliwe.

Areas dla ratunku

Co nam da wprowadzenie stref? Po pierwsze separacje nie tylko na poziomie kontrolerów ale również modeli i widoków! Każda strefa może posiadać także odrębny layout. Tak przedstawia się struktura projektu po wprowadzeniu stref:
Projekt został rozdzielony na obszary nad którymi można pracować oddzielnie.

Dwa kroki do użycia

Aby skorzystać z podstawowej funkcjonalności stref należy:

#1 zdefiniować nową mapę routingu:

app.UseMvc(routes =>
{
routes.MapRoute(
name:"areaRoute",
template: "{area:exists}/{controller=Home}/{action=Index}/{id?}");

routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});

Pierwsza deklaracja dotyczy stref. Parametr adresu url {area:exists} to nazwa strefy, następnie kontroler, akcja i opcjonalnie parametr.

#2 Na każdym kontrolerze w strefie nadać atrybut Area z nazwą strefy:

[Area("Orders")]
public class HomeController : Controller
{
public IActionResult Index()
{
return View();
}
}

Specjalnie podkreśliłem słowo „każdy” gdyż jego brak będzie prowadził do problemów dopasowania wielu kontrolerów.

#3 Miały być dwa kroki

Tak skonfigurowany projekt zadziała ale pod warunkiem, że nasze strefy umieściliśmy w katalogu o nazwie „Areas”. To właśnie tam domyślnie nasz view engine (no nie mogę  z tym ang.) będzie poszukiwał naszych stref. Jest możliwość zmiany tego stanu poprzez zmianę jego konfiguracji:

services.Configure<RazorViewEngineOptions>(options =>
{
options.AreaViewLocationFormats.Clear();
options.AreaViewLocationFormats.Add("/Modules/{2}/Views/{1}/{0}.cshtml");
options.AreaViewLocationFormats.Add("/Modules/{2}/Views/Shared/{0}.cshtml");
options.AreaViewLocationFormats.Add("/Views/Shared/{0}.cshtml");
});

Dla powyższego przykładu nasze strefy będą znajdować się w katalogu „Modules”. Parametry oznaczają:
{2} – nazwę strefy
{1} – nazwę kontrolera
{0} – nazwę akcji

To tyle jeśli chodzi o ideę stref. W moim projekcie dogevents wydzieliłem jedną strefę -administracyjną, która będzie panelem administracyjnym dla mnie 😉