wtorek, 7 marca 2017

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 ;)

Brak komentarzy:

Prześlij komentarz