Architettura di cipolla, architettura di progetto e autenticazione

1

Sto imparando ASP.NET MVC & API Web e tentativo di implementare Onion Architecture con modello di repository per uno dei miei progetti di test come parte del mio apprendimento.

Ho sviluppato singoli progetti MVC prima, ma non ho usato layer e onion.

La mia idea è di fornire dati a diversi client (Web-MVC 5, Xamarin - Android) utilizzando una singola API Web.

Ecco il modello / struttura che sto cercando di seguire:

  1. Progetto principale

    • Enti
    • di DTO
    • RepositoryInterface (GenericRepository + Individual InterfaceRepository)
  2. Progetto Infrastrcuture

    • Repository (Implementazione di RepositoryInterfaces)
    • Migrazioni (codice primo flusso di lavoro EF 6)
    • Mapping (usando AutoMapper)
    • DbContext.cs
  3. Progetto di prova (NUnit)

  4. Progetto WebApi 2

    • Controller con UnityDI
    • Autenticazione basata su token (?)
  5. Progetto MVC 5

    • Controller per fornire le viste
    • Autenticazione utente (?)
  6. Progetto Xamarin

Le mie domande sono le seguenti:

1) Sto andando nella direzione giusta?

2) Va bene non usare UnitOfWork mentre si usa il modello di deposito?

3) Sono davvero confuso riguardo all'autenticazione. Come dovrei autenticare i miei utenti e web API? Autenticazione moduli per gli utenti nella mia app? e token basato per web api?

Qualsiasi suggerimento / link / consiglio sono ben accetti.

    
posta RollsReus 19.10.2018 - 13:48
fonte

1 risposta

2

1) Am I going in the right direction?

Questa è una domanda troppo ampia se si desidera che risponda con una quantità di dettagli. Non sappiamo esattamente quale sia la tua attuale esperienza e se ci siano cose che vale la pena imparare qui.

La lista che hai creato non sembra sbagliata a prima vista, ma ci sono molti modi in cui potresti sbagliare.
Ho visto innumerevoli sviluppatori seguire una certa struttura senza effettivamente capirne il fine (ad esempio separazione dei livelli e SRP) e finire per perdere pesantemente le loro astrazioni attraverso gli strati comunque. Lo stesso potrebbe accadere qui e non avrei alcun modo di sapere; quindi sono preoccupato di dirti che è decisamente buono.

2) Is it Okay not to use UnitOfWork while using Repository Pattern?

In breve : ho creato repository senza unità di lavoro prima, ma una volta che il codice arriva a qualsiasi livello oltre le semplici operazioni CRUD, ti pentirai di non aver implementato una UoW. Suggerirei di implementare una UoW a meno che tu non sappia per un fatto che la tua applicazione non gestirà mai alcuna logica o transazione complessa.

Il modello di repository ha un grosso svantaggio. Sto omettendo le preoccupazioni a livello di architetto e sto solo affrontando problemi al livello in cui sembri.

Il grande svantaggio dei repository è che hanno il loro datacontext . Questo non è un problema quando le tue operazioni sono sempre focalizzate su una particolare entità (o modulo di dominio), ma il problema diventa più rilevante una volta che inizi a lavorare con più tipi di entità contemporaneamente (ad esempio un rapporto complesso o un metodo di importazione che crea molti tipi di entità).

Prima di tutto, dove inserire il codice che recupera tutti gli oggetti Foo e i relativi oggetti Bar correlati? %codice%? %codice%? Troverai un sacco di disaccordo qui. Qualunque sia la posizione che scegli, alcuni sviluppatori si aspettano sempre che si trovi nell'altra posizione o sostengono che dovrebbe essere collocato in una terza posizione.

In secondo luogo, i repository (senza un'unità di lavoro) ti fanno perdere l'integrità transazionale tra diversi tipi. Supponiamo che tu abbia un'importazione che dovrebbe creare 3 oggetti (un FooRepository , un BarRepository e un Foo . Tuttavia, se una di queste azioni dovesse fallire, vuoi assicurarti che nessuno degli elementi vengono salvati.

Senza un'unità di lavoro, il tuo Bar avrà un datacontext diverso dal tuo Baz , il che porta a un'impossibilità di assicurare che entrambi gli elementi / nessuno siano salvati nel database.

Un'unità di lavoro, tuttavia, garantisce che tutti i repository (nello stesso oggetto uow) condividano lo stesso datacontext e pertanto è possibile mantenere l'integrità transazionale.

Esistono altri metodi per implementare l'integrità delle transazioni, ma sono spesso sporche e notevolmente inferiori all'implementazione di UoW.

3) I am really confused about Authentication. How should I authenticate my users and web api? Forms Authentication for users in my app? and token based for web api?

Dipende molto da ciò che stai cercando di realizzare. Chi saranno i tuoi utenti finali? Persone a caso? I dipendenti di una certa compagnia? È necessario che gli utenti effettuino l'autenticazione sull'app e non solo rendano l'app liberamente accessibile, ma blocchino tutte le informazioni dietro la stessa API? Richiede l'autenticazione offline e / o l'accesso alle risorse?

Non c'è una risposta qui. Questo ha bisogno di un lotto più spiegazione da parte tua e dovrebbe essere una domanda separata.

    
risposta data 19.10.2018 - 14:11
fonte