2016-04-25 15 views
5

La mia tipica struttura di applicazione Web .NET 4.5X ha un minimo di 3 livelli: un progetto Web (un'applicazione Web .NET), un progetto di dominio/business logic (a libreria di classi) e un progetto di accesso ai dati (una libreria di classi). Il progetto Web fa riferimento al livello aziendale e il livello aziendale fa riferimento al livello di accesso ai dati.Organizzazione di un'app dotnet core per 3 livelli con livello di accesso ai dati

Mi piace questo approccio poiché il mio progetto web non ha un riferimento al progetto di accesso ai dati (deve prima passare attraverso il livello dominio/business logic). Il mio progetto web non dovrebbe avere alcun accesso alle classi di contesto o repository.

Nell'app .net 4.5.X a 3 livelli, dichiaro la stringa di connessione nel file web.config e fornire il nome di DbContext come attributo nome della stringa di connessione.

Nel nuovo paradigma Dotnet core, tutti gli esempi che vedo ha la DbContext configurato nel Startup.cs come questo:

public void ConfigureServices(IServiceCollection services) 
{ 
    // Add framework services. 
    services.AddMvc(); 
    services.AddEntityFramework() 
     .AddSqlServer() 
     .AddDbContext<MyApplicationContext>("myconnectionstring or reference to it"); 
} 

Dando l'avvio una classe concreta da utilizzare per il DbContext, devo fare riferimento il progetto di accesso ai dati, in cui è definito il dbcontext. Preferirei fare riferimento solo al livello intermedio ed evitare il riferimento al DAL.

La mia domanda è: come dovrei organizzare la mia struttura di soluzione in modo da evitare di aggiungere un riferimento dal mio progetto web al mio progetto di accesso ai dati?

Posso utilizzare una proprietà appsettings.json?

Posso aggiungere la mia configurazione di Entity in un altro modo?

C'è qualcosa di importante che mi manca nel core del punto rete?

Grazie in anticipo.

+1

Questa risposta può essere utile, rimuove il riferimento EF nel livello Web http://stackoverflow.com/a/38360204/1544886 –

risposta

3

ho trovato una soluzione utilizzando EF6 e Dotnet Nucleo che io sono abbastanza confortevole con.

Non utilizza la chiamata services.AddSqlServer() per EF7, ma utilizza piuttosto una configurazione EF6 e registra DbContext in una classe Bootstrap chiamata all'avvio.

public static class BootstrapConfig 
{ 
    public static void RegisterApplicationServices(this IServiceCollection services, IConfigurationRoot configuration) 
    { 
     // DbContext 
     services.AddScoped<DbContext>(x => new ApplicationContext(configuration["Data:ApplicationContext:ConnectionString"])); 
    } 
} 

Questo è chiamato dalle Startup.cs nel progetto WebLibrary come

public void ConfigureServices(IServiceCollection services) 
{ 
    // Add framework services. 
    services.AddMvc(); 

    services.RegisterApplicationServices(Configuration); 
} 

enter image description here

WebLibrary è l'applicazione principale web dot net (contiene controllori, è il progetto di avvio).

La logica aziendale è il livello di servizio ed è il livello intermedio tra l'app Web e il progetto di accesso ai dati.

Data Access è dove sono presenti le classi dbContext e repository per l'esecuzione di una query.

Il progetto Modello contiene POCO ed enumerazioni, non oggetti intelligenti ma contenitori utilizzati nell'applicazione.

Il progetto Bootstrap ha un riferimento alla logica aziendale e ai progetti di accesso ai dati in modo che possa registrare i servizi e gli archivi per il contenitore IOC.

Verificare la github repo per la soluzione di esempio. Un problema che ho ancora, specifico per la mia domanda è questa:

Anche se la libreria Web non dispone di un riferimento al progetto di accesso ai dati, posso ancora istanziare un ApplicationContext da uno dei controller. Il punto principale della separazione di questi progetti era che avrei potuto rendere impossibile ottenere un contesto db direttamente nel progetto web. Non sono sicuro che ciò sia correlato alla nuova struttura della soluzione in Core o se includo qualcosa di cui non sono a conoscenza.

+3

Buon lavoro nei tuoi tentativi, a volte mi chiedo se valga la pena fare tutto il possibile per evitare che il contesto sfugga ai livelli che non dovrebbe essere, un team fidato di sviluppatori competenti probabilmente supererà senza abusare del fatto che ci sia accesso al contesto –

2

Penso che stiate cercando il modello Repository. È uno strato tra la tua azienda e DAL.

Ecco come ho organizzato una soluzione recente per evitare che l'interfaccia utente conosca il mio DAL.

enter image description here

+0

Grazie per la risposta. Sono ben consapevole del modello di repository. Nel progetto di accesso ai dati che ho descritto sopra, creo le mie classi di repository che vengono utilizzate dalle classi di servizi nel livello intermedio (business logic). Le classi di servizio vengono quindi utilizzate dai miei membri Web (in genere controller mvc/api). La mia principale preoccupazione è evitare il riferimento del progetto dal progetto client/web al livello dati. – rictionaryFever

+0

Così puoi creare un altro progetto per il tuo repository e fare in modo che quel progetto faccia riferimento al tuo livello dati. e il tuo progetto web fa riferimento al tuo nuovo progetto di repository? –

+0

Grazie per il seguito. Riesco a vedere l'utilità della struttura del progetto che stai suggerendo e non ho problemi ad implementare quella struttura con un'applicazione .NET 4. ma il mio problema principale è capire come implementare il layering con .NET Core (.NET 5). Potrebbe essere che mi manca totalmente il punto. Qualunque soluzione risolvo, aggiornerò questa domanda con la mia soluzione. In .NET Core, puoi aggiungere il tuo dbcontext come servizio in Startup.cs. Voglio mantenere quel dbcontext fuori dal progetto di applicazione web. – rictionaryFever