5

Ho letto alcuni articoli e ho guardato molte lezioni/esercitazioni su YT su DI e IoC, ma non ho trovato alcun layout consigliato di cataloghi nella soluzione VS.Qual è la struttura di cartelle consigliata dei cataloghi nel progetto usando IoC

Sto parlando del progetto (un gioco per esempio) in cui si dispone di alcune classi/interfacce, logger, provider di database, servizi WCF, WPF livello di presentazione (che è in realtà diverse del progetto) ...

Is c'è qualche progetto di pattern, che mostra come dovrei organizzare il mio progetto, quindi il prossimo programmatore esperto non perderà tempo a capire cosa sta succedendo? Come stiamo parlando di "self commented code", sto parlando di "self commented project structure".

Ad esempio, dovrei inserire tutte le interfacce nel catalogo "Interfacce"? O dovrei (nel caso del logger) creare il catalogo "Logger" e mettere lì l'interfaccia, le classi, la classe con i metodi di estensione (tutti concentrati sulla registrazione). Codice focalizzato su Board, nel catalogo "Board". Catalogo separato per "Campo" ecc. Ecc.

In questo momento la struttura sembra così. Non sono sicuro di "Business" lì e Logger. Ho un'interfaccia in un catalogo diverso da altre classi di logger. Devo chiamare il fornitore di Log4Net? o adattatore? o decoratore? È solo una classe di logger che implementa l'interfaccia ILogger. Ecco la schermata: link

Ecco il codice di esempio (non c'è CIO ancora, ma tutti si accorge ci saranno 3 interfacce non mappati molto semplice.):

public class Game 
{ 
    public IBoard Board { get; set; } 

    public Game(IBoard board) 
    { 
     Board = board; 
    } 
} 

public interface IBoard {} 

public class Board : IBoard 
{ 
    public IField[,] Fields { get; set; } 
    public Board(IField field, int boardWidth, int boardHeight) 
    { 
     Fields = new IField[boardHeight, boardWidth]; 
     Fields.Initialize(); 
    } 
} 

public interface IField {} 

public class Field : IField {} 

public interface ILogger 
{ 
    void Log(LogEntry entry); 
} 
+0

Strictly based based - usa layout che funziona per te/la tua squadra. Spesso il framework che si utilizza suggerisce un layout (ad esempio, ASP.Net MVC suggerisce cartelle di controller/modelli/viste), ma non esiste un vero e proprio standard d'oro (e probabilmente varierà anche tra diversi contenitori DI). –

+2

Dai un'occhiata alla [cipolla] (https://rules.ssw.com.au/do-you-know-the-layers-of-the-onion-architecture) architettura – qujck

risposta

7

Cosa faccio di solito è che ho un livello MyApplication.Core (libreria di classi), che contiene tutte le interfacce delle applicazioni con le dipendenze di terze parti (leggere: nessuna), ad esempio ILogger, ICommand o IQuery<TResult>.

Successivamente ho un livello MyApplication.Domain (libreria di classi) che contiene tutte le conoscenze specifiche del dominio dell'applicazione: questo è il livello aziendale. Questa è l'implementazione delle interfacce principali ICommand, IQuery<TResult>. Queste implementazioni hanno quindi una dipendenza da es. ILogger. Mai implementazioni concrete

Quindi ho la MyApplication.Infrastructure (libreria di classi) che è dove sono implementate tutte le interfacce di servizio da MyApplication.Core, ad es. ILogger. Qui puoi avere dipendenze da librerie di terze parti come Log4Net.

Quindi, ultimo ho il livello di presentazione, che nel mio caso è di solito un'applicazione MVC, quindi chiamerei questo MyApplication.Web.Mvc. Tutti i controller hanno solo dipendenze sulle interfacce. Mai implementazioni concrete Questo livello è anche responsabile del bootstrap di tutte le interfacce con le implementazioni concrete utilizzando uno Composition Root.

TL; DR:

  • MyApplication.Core (Application Interface Layer)
  • MyApplication.Domain (Business Logic)
  • MyApplication.Infrastructure (Implementazioni di Application Interface Layer)
  • MyApplication. Web.Mvc (Presentation and Composition Root Layer)
+0

Quindi, in 'Core' ho solo interfacce, in 'Dominio' ho classi con logica di gioco (implementando le interfacce sopra), quindi Game, Board, Field. 'Infrastructure' è ancora un po 'poco chiaro - è un posto solo per i" provider "di librerie di terze parti? Dove collocare il codice relativo al database - in "Infrastruttura"? –

+0

'Dominio' è la logica aziendale, cioè dove sono le tue entità. Sì, a mio parere le integrazioni di terze parti dovrebbero essere fatte solo in "Infrastruttura", questo è anche il luogo dove vengono stabilite le connessioni del database - probabilmente con un semplice 'IRepository ' da astrazione 'Core' in modo che le entità possano lavorare con il database un'interfaccia invece direttamente anche se dura dipendenza. – janhartmann

+1

Puoi consultare https://github.com/janhartmann/nerve-framework che è una libreria di infrastrutture che ho creato. Un'applicazione di esempio può essere visualizzata su https://github.com/janhartmann/nerve-framework-sample - può darti idee su come strutturare un'applicazione. – janhartmann

Problemi correlati